日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【毕业设计】基于stm32的示波器设计与实现 - 单片机 嵌入式

發布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【毕业设计】基于stm32的示波器设计与实现 - 单片机 嵌入式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 簡介
  • 2 主要器件
  • 3 實現效果
  • 4 設計原理
  • 5 部分實現代碼


1 簡介

🔥 Hi,大家好,這里是丹成學長的畢設系列文章!

🔥 對畢設有任何疑問都可以問學長哦!

這兩年開始,各個學校對畢設的要求越來越高,難度也越來越大… 畢業設計耗費時間,耗費精力,甚至有些題目即使是專業的老師或者碩士生也需要很長時間,所以一旦發現問題,一定要提前準備,避免到后面措手不及,草草了事。

為了大家能夠順利以及最少的精力通過畢設,學長分享優質畢業設計項目,今天要分享的新項目是

🚩 基于stm32的示波器設計

🥇學長這里給一個題目綜合評分(每項滿分5分)

  • 難度系數:4分
  • 工作量:4分
  • 創新點:3分

🧿 選題指導, 項目分享:

https://blog.csdn.net/molodi/article/details/125933857

2 主要器件

3 實現效果

4 設計原理

學長設計的示波器采用了一套成本低廉但高效的硬件,配合層次化的軟件框架,實現對常規低頻信號波形的采集、分析、顯示。

硬件部分的主要工作有:電源管理(5V、2.5V、-5V);對信號的衰減、限幅、偏置。最后將處理好的電壓信號送入MCU的ADC外設,進行數據采集。由于ADC外設只能采集正電壓,因此我們通過增加偏置電壓的方式,將負電壓抬高來采集。

軟件部分的主要工作有:底層驅動SDK框架、ADC濾波算法、波形數據處理、人機交互界面。SDK提供基本的模塊和外設驅動支持,濾波算法去除噪聲和毛刺,波形處理計算電壓值和頻率,并為波形顯示做準備;人機交互界面提供屏幕顯示(OLED屏)和操作方式(旋鈕和按鍵)。

5 部分實現代碼


部分核心代碼:

/********************************************************** 簡介:ADC1-CH6初始化函數 ***********************************************************/ void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道時鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M//PA6 作為模擬通道輸入引腳 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); //復位ADC1,將外設 ADC1 的全部寄存器重設為缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1工作在獨立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模數轉換工作在單通道模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模數轉換工作在非連續轉換模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; //轉換由定時器2的通道2觸發(只有在上升沿時可以觸發)ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數據右對齊ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進行規則轉換的ADC通道的數目ADC_Init(ADC1, &ADC_InitStructure); //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器 ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1ADC_DMACmd(ADC1, ENABLE); //ADC的DMA功能使能ADC_ResetCalibration(ADC1); //使能復位校準 ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_1Cycles5 );//ADC1通道6,采樣時間為239.5周期 ADC_ResetCalibration(ADC1);//復位較準寄存器while(ADC_GetResetCalibrationStatus(ADC1)); //等待復位校準結束ADC_StartCalibration(ADC1); //開啟AD校準while(ADC_GetCalibrationStatus(ADC1)); //等待校準結束ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的軟件轉換啟動功能} /****************************************************************** 函數名稱:TIM2_PWM_Init(u16 arr,u16 psc) 函數功能:定時器3,PWM輸出模式初始化函數 參數說明:arr:重裝載值psc:預分頻值 備 注:通過TIM2-CH2的PWM輸出觸發ADC采樣 *******************************************************************/ void TIM2_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定時器2時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘//設置該引腳為復用輸出功能,輸出TIM2 CH2的PWM脈沖波形 GPIOA.1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//初始化TIM3TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位//初始化TIM2 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性高TIM_OCInitStructure.TIM_Pulse=1000; //發生反轉時的計數器數值,用于改變占空比TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM2TIM_CtrlPWMOutputs(TIM2, ENABLE);//使能PWM輸出TIM_Cmd(TIM2, ENABLE); //使能TIM2 } /****************************************************************** 函數名稱:MYDMA1_Config() 函數功能:DMA1初始化配置 參數說明:DMA_CHx:DMA通道選擇cpar:DMA外設ADC基地址cmar:DMA內存基地址cndtrDMA通道的DMA緩存的大小 備 注: *******************************************************************/ void MYDMA1_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr) {DMA_InitTypeDef DMA_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA傳輸DMA_DeInit(DMA_CHx); //將DMA的通道1寄存器重設為缺省值DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外設ADC基地址DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA內存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //數據傳輸方向,從外設讀取發送到內存//DMA_InitStructure.DMA_BufferSize = cndtr; //DMA通道的DMA緩存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設地址寄存器不變DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內存地址寄存器遞增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //數據寬度為16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //數據寬度為16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循環模式DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x擁有高優先級 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x沒有設置為內存到內存傳輸DMA_Init(DMA_CHx, &DMA_InitStructure); //ADC1匹配DMA通道1DMA_ITConfig(DMA1_Channel1,DMA1_IT_TC1,ENABLE); //使能DMA傳輸中斷 //配置中斷優先級NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA通道 } #define NPT 1024//一次完整采集的采樣點數/****************************************************************** 函數名稱:GetPowerMag() 函數功能:計算各次諧波幅值 參數說明: 備  注:先將lBufOutArray分解成實部(X)和虛部(Y),然后計算幅值(sqrt(X*X+Y*Y) *******************************************************************/ void GetPowerMag(void) {float X,Y,Mag,magmax;//實部,虛部,各頻率幅值,最大幅值u16 i;//調用自cr4_fft_1024_stm32cr4_fft_1024_stm32(fftout, fftin, NPT); //fftin為傅里葉輸入序列數組,ffout為傅里葉輸出序列數組for(i=1; i<NPT/2; i++){X = (fftout[i] << 16) >> 16;Y = (fftout[i] >> 16);Mag = sqrt(X * X + Y * Y); FFT_Mag[i]=Mag;//存入緩存,用于輸出查驗//獲取最大頻率分量及其幅值if(Mag > magmax){magmax = Mag;temp = i;}}F=(u16)(temp*(fre*1.0/NPT));//源代碼中此公式有誤,將此復制進去LCD_ShowNum(280,180,F,5,16); } u16 magout[NPT]; /****************************************************************** 函數名稱:InitBufInArray() 函數功能:正弦波值初始化,將正弦波各點的值存入magout[]數組中 參數說明: 備 注: *******************************************************************/ void InitBufInArray(void) {u16 i;float fx;for(i=0; i<NPT; i++){fx = sin((PI2*i)/NPT);magout[i] = (u16)(2048+2048*fx);} }/****************************************************************** 函數名稱:sinout() 函數功能:正弦波輸出 參數說明: 備 注:將此函數置于定時器中斷中,可模擬輸出正弦波 *******************************************************************/ void sinout(void) {static u16 i=0;DAC_SetChannel1Data(DAC_Align_12b_R,magout[i]);i++;if(i>=NPT)i=0; } void Dac2_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_InitType;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA通道時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能DAC通道時鐘 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);DAC_InitType.DAC_Trigger=DAC_Trigger_T4_TRGO; //定時器4觸發DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_Noise;//產生噪聲//DAC_WaveGeneration_Triangle產生三角波DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_TriangleAmplitude_4095;//幅值設置為最大,即3.3VDAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1輸出緩存關閉 BOFF1=1DAC_Init(DAC_Channel_2,&DAC_InitType); //初始化DAC通道2DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC-CH2DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右對齊數據格式設置DAC值 }

🧿 選題指導, 項目分享:

https://blog.csdn.net/molodi/article/details/125933857

總結

以上是生活随笔為你收集整理的【毕业设计】基于stm32的示波器设计与实现 - 单片机 嵌入式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。