文章目錄
- 1 簡介
- 2 主要器件
- 3 實現效果
- 4 設計原理
- 5 部分實現代碼
1 簡介
🔥 Hi,大家好,這里是丹成學長的畢設系列文章!
🔥 對畢設有任何疑問都可以問學長哦!
這兩年開始,各個學校對畢設的要求越來越高,難度也越來越大… 畢業設計耗費時間,耗費精力,甚至有些題目即使是專業的老師或者碩士生也需要很長時間,所以一旦發現問題,一定要提前準備,避免到后面措手不及,草草了事。
為了大家能夠順利以及最少的精力通過畢設,學長分享優質畢業設計項目,今天要分享的新項目是
🚩 基于stm32的示波器設計
🥇學長這里給一個題目綜合評分(每項滿分5分)
🧿 選題指導, 項目分享:
https://blog.csdn.net/molodi/article/details/125933857
2 主要器件
3 實現效果
4 設計原理
學長設計的示波器采用了一套成本低廉但高效的硬件,配合層次化的軟件框架,實現對常規低頻信號波形的采集、分析、顯示。
硬件部分的主要工作有:電源管理(5V、2.5V、-5V);對信號的衰減、限幅、偏置。最后將處理好的電壓信號送入MCU的ADC外設,進行數據采集。由于ADC外設只能采集正電壓,因此我們通過增加偏置電壓的方式,將負電壓抬高來采集。
軟件部分的主要工作有:底層驅動SDK框架、ADC濾波算法、波形數據處理、人機交互界面。SDK提供基本的模塊和外設驅動支持,濾波算法去除噪聲和毛刺,波形處理計算電壓值和頻率,并為波形顯示做準備;人機交互界面提供屏幕顯示(OLED屏)和操作方式(旋鈕和按鍵)。
5 部分實現代碼
部分核心代碼:
void Adc_Init(void)
{ ADC_InitTypeDef ADC_InitStructure
; GPIO_InitTypeDef GPIO_InitStructure
;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
|RCC_APB2Periph_ADC1
, ENABLE
); RCC_ADCCLKConfig(RCC_PCLK2_Div6
); 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
); ADC_InitStructure
.ADC_Mode
= ADC_Mode_Independent
; ADC_InitStructure
.ADC_ScanConvMode
= DISABLE
; ADC_InitStructure
.ADC_ContinuousConvMode
= DISABLE
; ADC_InitStructure
.ADC_ExternalTrigConv
= ADC_ExternalTrigConv_T2_CC2
; ADC_InitStructure
.ADC_DataAlign
= ADC_DataAlign_Right
; ADC_InitStructure
.ADC_NbrOfChannel
= 1; ADC_Init(ADC1
, &ADC_InitStructure
); ADC_Cmd(ADC1
, ENABLE
); ADC_DMACmd(ADC1
, ENABLE
); ADC_ResetCalibration(ADC1
); ADC_RegularChannelConfig(ADC1
, ADC_Channel_6
, 1, ADC_SampleTime_1Cycles5
);ADC_ResetCalibration(ADC1
);while(ADC_GetResetCalibrationStatus(ADC1
)); ADC_StartCalibration(ADC1
); while(ADC_GetCalibrationStatus(ADC1
)); ADC_SoftwareStartConvCmd(ADC1
, ENABLE
); }
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
); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
| RCC_APB2Periph_AFIO
, ENABLE
); GPIO_InitStructure
.GPIO_Pin
= GPIO_Pin_1
; GPIO_InitStructure
.GPIO_Mode
= GPIO_Mode_AF_PP
; GPIO_InitStructure
.GPIO_Speed
= GPIO_Speed_50MHz
;GPIO_Init(GPIOA
, &GPIO_InitStructure
);TIM_TimeBaseStructure
.TIM_Period
= arr
; TIM_TimeBaseStructure
.TIM_Prescaler
=psc
; TIM_TimeBaseStructure
.TIM_ClockDivision
= 0; TIM_TimeBaseStructure
.TIM_CounterMode
= TIM_CounterMode_Up
; TIM_TimeBaseInit(TIM2
, &TIM_TimeBaseStructure
); TIM_OCInitStructure
.TIM_OCMode
= TIM_OCMode_PWM1
; TIM_OCInitStructure
.TIM_OutputState
= TIM_OutputState_Enable
; TIM_OCInitStructure
.TIM_OCPolarity
= TIM_OCPolarity_Low
; TIM_OCInitStructure
.TIM_Pulse
=1000; TIM_OC2Init(TIM2
, &TIM_OCInitStructure
); TIM_CtrlPWMOutputs(TIM2
, ENABLE
);TIM_Cmd(TIM2
, ENABLE
);
}
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_DeInit(DMA_CHx
); DMA_InitStructure
.DMA_PeripheralBaseAddr
= cpar
; DMA_InitStructure
.DMA_MemoryBaseAddr
= cmar
; DMA_InitStructure
.DMA_DIR
= DMA_DIR_PeripheralSRC
; DMA_InitStructure
.DMA_BufferSize
= cndtr
; DMA_InitStructure
.DMA_PeripheralInc
= DMA_PeripheralInc_Disable
; DMA_InitStructure
.DMA_MemoryInc
= DMA_MemoryInc_Enable
; DMA_InitStructure
.DMA_PeripheralDataSize
= DMA_PeripheralDataSize_HalfWord
; DMA_InitStructure
.DMA_MemoryDataSize
= DMA_MemoryDataSize_HalfWord
; DMA_InitStructure
.DMA_Mode
= DMA_Mode_Circular
; DMA_InitStructure
.DMA_Priority
= DMA_Priority_High
; DMA_InitStructure
.DMA_M2M
= DMA_M2M_Disable
; DMA_Init(DMA_CHx
, &DMA_InitStructure
); DMA_ITConfig(DMA1_Channel1
,DMA1_IT_TC1
,ENABLE
); 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
);
}
#define NPT 1024
void GetPowerMag(void)
{float X
,Y
,Mag
,magmax
;u16 i
;cr4_fft_1024_stm32(fftout
, fftin
, NPT
); 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
];
void InitBufInArray(void)
{u16 i
;float fx
;for(i
=0; i
<NPT
; i
++){fx
= sin((PI2
*i
)/NPT
);magout
[i
] = (u16
)(2048+2048*fx
);}
}
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
); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC
, ENABLE
); 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
; DAC_InitType
.DAC_WaveGeneration
=DAC_WaveGeneration_Noise
;DAC_InitType
.DAC_LFSRUnmask_TriangleAmplitude
=DAC_TriangleAmplitude_4095
;DAC_InitType
.DAC_OutputBuffer
=DAC_OutputBuffer_Disable
; DAC_Init(DAC_Channel_2
,&DAC_InitType
); DAC_Cmd(DAC_Channel_2
, ENABLE
); DAC_SetChannel1Data(DAC_Align_12b_R
, 0);
}
🧿 選題指導, 項目分享:
https://blog.csdn.net/molodi/article/details/125933857
總結
以上是生活随笔為你收集整理的【毕业设计】基于stm32的示波器设计与实现 - 单片机 嵌入式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。