久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1686|回復: 0
收起左側

STM32單片機示波器(pyhton上位機)

[復制鏈接]
ID:771642 發表于 2023-5-30 16:59 | 顯示全部樓層 |閱讀模式
本設計以Python為上位機制作的STM32示波器,實現了波形顯示、頻率計算、波形保存等功能,代碼均有完整中文注釋,供大家參考(如果有條件,使用OLED顯示屏當做上位機實現該設計,這樣有效的減少了上位機界面刷新的延遲)

文件包括上位機 下位機 測試數據等

上位機程序:
  1. import serial
  2. import threading
  3. import time
  4. import matplotlib.pyplot as plt
  5. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
  6. import tkinter as tk
  7. from tkinter import ttk
  8. from tkinter import filedialog
  9. from PIL import Image, ImageTk
  10. import numpy as np

  11. class Oscilloscope:
  12.     def __init__(self, master):
  13.         self.master = master                    # 定義 master 變量
  14.         self.master.title("簡易示波器")          # 設置窗口標題
  15.         self.master.geometry("1400x600")         # 設置窗口大小
  16.         self.master.resizable(False, False)     # 設置窗口不可調整大小
  17.         self.master.protocol("WM_DELETE_WINDOW", self.close_window)  # 設置關閉窗口時調用的方法

  18.         self.ser = None                         # 定義 ser 變量,初始值為 None
  19.         self.baudrate = tk.StringVar(value="921600")                    # 定義波特率變量,初始值為 "921600"
  20.         self.port = tk.StringVar(value="COM5")                          # 定義端口變量,初始值為 "COM11"
  21.         self.size = tk.StringVar(value=50)
  22.         self.MAXvar = tk.StringVar()
  23.         self.MINvar = tk.StringVar()
  24.         self.Fvar = tk.StringVar()
  25.         self.Fsvar = tk.StringVar()
  26.         self.pause = tk.BooleanVar(value=False)                         # 定義暫停變量,初始值為 False
  27.         self.fig = plt.Figure(figsize=(6, 4), dpi=100)                  # 創建一個 Figure 對象
  28.         self.ax = self.fig.add_subplot(111)                             # 在 Figure 對象中添加一個子圖
  29.         self.canvas = FigureCanvasTkAgg(self.fig, master=self.master)   # 創建一個畫布對象
  30.         self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)  # 將畫布添加到窗口中
  31.         self.toolbar = tk.Frame(master=self.master)                     # 創建一個工具欄對象
  32.         self.toolbar.pack(side=tk.TOP, fill=tk.X)                       # 將工具欄添加到窗口中
  33.         self.pause_button = ttk.Checkbutton(self.toolbar, text="暫停", variable=self.pause, command=self.pause_waveform, width=6)  # 創建一個暫停按鈕
  34.         self.pause_button.pack(side=tk.LEFT, padx=5)                    # 將暫停按鈕添加到工具欄中
  35.         self.save_button = ttk.Button(self.toolbar, text="保存圖片", command=self.save_waveform, width=8)  # 創建一個保存按鈕
  36.         self.save_button.pack(side=tk.LEFT, padx=5)                     # 將保存按鈕添加到工具欄中
  37.         self.port_label = ttk.Label(self.toolbar, text="端口:", width=6)         # 創建一個端口標簽
  38.         self.port_label.pack(side=tk.LEFT, padx=5)                      # 將端口標簽添加到工具欄中
  39.         self.port_combobox = ttk.Combobox(self.toolbar, textvariable=self.port, values=["COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8","COM10"], width=6)  # 創建一個端口下拉框
  40.         self.port_combobox.pack(side=tk.LEFT, padx=5)                   # 將端口下拉框添加到工具欄中
  41.         self.baudrate_label = ttk.Label(self.toolbar, text="波特率:", width=6)    # 創建一個波特率標簽
  42.         self.baudrate_label.pack(side=tk.LEFT, padx=5)                  # 將波特率標簽添加到工具欄中
  43.         self.baudrate_combobox = ttk.Combobox(self.toolbar, textvariable=self.baudrate, values=["9600", "115200","921600"], width=6)  # 創建一個波特率下拉框
  44.         self.baudrate_combobox.pack(side=tk.LEFT, padx=5)               # 將波特率下拉框添加到工具欄中
  45.         self.baudrate_label = ttk.Label(self.toolbar, text="橫軸長度:", width=8)    # 創建一個波特率標簽
  46.         self.baudrate_label.pack(side=tk.LEFT, padx=5)                  # 將波特率標簽添加到工具欄中
  47.         self.baudrate_combobox = ttk.Combobox(self.toolbar, textvariable=self.size, values=[50, 100, 200, 500, 1000], width=5)  # 創建一個橫坐標尺寸下拉框
  48.         self.baudrate_combobox.pack(side=tk.LEFT, padx=5)               # 將波特率下拉框添加到工具欄中
  49.         self.connect_button = ttk.Button(self.toolbar, text="連接", command=self.connect, width=6)                           # 創建一個連接按鈕
  50.         self.connect_button.pack(side=tk.LEFT, padx=5)                  # 將連接按鈕添加到工具欄中
  51.         self.disconnect_button = ttk.Button(self.toolbar, text="斷開連接", command=self.disconnect, width=8)             # 創建一個斷開連接按鈕
  52.         self.disconnect_button.pack(side=tk.LEFT, padx=5)
  53.         self.disconnect_button = ttk.Button(self.toolbar, text="清除圖像", command=self.clear, width=8)              # 創建一個斷開連接按鈕
  54.         self.disconnect_button.pack(side=tk.LEFT, padx=5)                # 將斷開連接按鈕添加到工具欄中
  55. ······
復制代碼
下位機主程序:
  1. /**********************************************************
  2.                                                                                         MCU接線說明
  3. 采樣接口:PA6
  4. 正弦波:PA4
  5. 三角波:PA5
  6. 增加采樣頻率:KEY0
  7. 降低采樣頻率:KEY1

  8. 基于正點原子精英板 MCU STM32F1Z8T6
  9. 時間:2023年5月12日
  10. ***********************************************************/
  11. #include "led.h"
  12. #include "delay.h"
  13. #include "sys.h"
  14. #include "usart.h"
  15. #include "lcd.h"
  16. #include "adc.h"
  17. #include "dma.h"
  18. #include "timer.h"
  19. #include "table_fft.h"
  20. #include "stm32_dsp.h"
  21. #include "math.h"
  22. #include "key.h"
  23. #include "BEEP.h"
  24. #include "dac.h"
  25. #include "exti.h"

  26. #define NPT 1024 //采樣次數
  27. #define PI2 6.28318530717959  //2*pi 用于正弦波生成


  28. void InitBufInArray(void);   //正弦波輸出緩存
  29. void sinout(void);                                          //正弦波輸出
  30. void GetPowerMag(void);      //FFT變換,輸出頻率
  31. void sendData(void);
  32. int long fftin [NPT];        //FFT輸入 x[n]
  33. int long fftout[NPT];        //FFT輸出 X[k]
  34. u32 FFT_Mag[NPT/2]={0};      //幅頻特性
  35. u16 magout[NPT];                                                 //模擬正弦波輸出緩存區

  36. u16 currentadc;              //實時采樣數據
  37. u16 adcx[NPT];               //adc數值緩存
  38. u32 adcmax;                  //采樣最大值和最小值
  39. u32 adcmin;
  40. u8 adc_flag=0;                                                   //采樣結束標志
  41. u8 key_flag=0;                                                          //按鍵掃描標志
  42. u8 show_flag=1;                                                         //更新暫停標志
  43. u16 T=2000;                                                                         //定時器2重載值,不能小于PWM的Pluse值
  44. u16 pre=36;                                                                          //定時器2預分頻值
  45. u32 fre;                                                                                   //采樣頻率 Hz
  46. u16 F;                                                                                         //波形頻率

  47. u16 temp=0;                                                                         //幅值最大的頻率成分
  48. u16 t=0;
  49. u16 key;                                                                                  //按鍵

  50. int main()
  51. {
  52.         u16 i;
  53.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  54.         MYDMA1_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)¤tadc,1);
  55.         uart_init(921600);
  56.         delay_init();
  57.         LED_Init();
  58.         EXTIX_Init();
  59.         Adc_Init();
  60.         InitBufInArray();
  61.         TIM4_Int_Init(1,35);                                //三角波和噪聲頻率控制,
  62.         TIM3_Int_Init(39,71);                                //72MHz/40/72=25kHz   25kHz/1024≈25Hz 正弦波頻率約為24.5Hz
  63.         TIM2_PWM_Init(T-1,pre-1);                //最大頻率72000000/1/2000=3.6KHz
  64.         Dac1_Init();
  65.         Dac2_Init();
  66.         
  67.         while(1)
  68.         {
  69.                 //等待采樣完成
  70.                 while(adc_flag==0)
  71.                 {
  72.                         LED1=!LED1;
  73.                         sendData(); //發數據給上位機
  74.                         delay_ms(100);
  75.                
  76.                 }
復制代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九久久国产 | 瑞克和莫蒂第五季在线观看 | 91香蕉| 日韩精品在线看 | 亚洲一区中文字幕在线观看 | 久久久无码精品亚洲日韩按摩 | 精品一区在线免费观看 | 国产美女在线精品免费 | 国产麻豆乱码精品一区二区三区 | 日韩有码在线观看 | 亚洲欧美国产毛片在线 | 狠狠热视频 | 亚洲欧美精品国产一级在线 | 欧美久久国产精品 | 蜜桃一区 | 欧美一区二区三区在线 | 国产黄色小视频在线观看 | 欧美a在线看 | 最新黄色毛片 | 日本字幕在线观看 | 青青草网| 97碰碰碰 | 激情视频一区 | 日本 欧美 三级 高清 视频 | 国产精品精品视频一区二区三区 | 国产99热在线 | 天堂亚洲网 | 免费观看的av | 2019中文字幕视频 | 欧美精品一区二区三区四区 在线 | 中文字幕在线视频免费视频 | 国产乡下妇女做爰 | av网站在线看 | 久久精品91久久久久久再现 | 武道仙尊动漫在线观看 | 国产亚洲一区二区精品 | 欧美精品91 | 97精品超碰一区二区三区 | 久久精品国产久精国产 | 久久国产精品免费一区二区三区 | 国产欧美一区二区三区另类精品 |