所需材料:
芯片:stm32f103c8t6
oled显示屏
效果展示:
100hz占空比50%的pwm波
100hz占空比95%的pwm波
教程正文:
1.ADC+DMA方式采集
ADC配置
DMA配置
uint32_t adc[1];//定义为全局变量
HAL_ADC_Start_DMA(&hadc1,adc,1);//开启ADC 由于是normal模式所以在主函数里需要重复调用来采集
2.定时器中断配置及PWM波发生
//初始化部分
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
//主循环
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,5000);
3.关键部分代码
void shibo()
{
OLED_refresh_gram();//刷新
HAL_ADC_Start_DMA(&hadc1,adc,1);
Bias=adc[0]/100+10;
//消除误差
if(Bias>max)
max=Bias;
mine=Bias;
if(max-Bias<5)
Bias=max;
if(Bias-mine<5)
Bias=mine;
OLED_draw_line(j,Bias,j+1,Bias,PEN_WRITE);
OLED_draw_point(j,Bias,PEN_WRITE);
c=fabs(Last_Bias-Bias);
if((Last_Bias-Bias)>10||(Bias-Last_Bias)>10)
OLED_draw_line(j,Bias,j,Last_Bias,PEN_WRITE);
j=j+2;
Last_Bias=Bias;
if(j>127)
{ OLED_operate_gram(PEN_CLEAR);//清屏
OLED_refresh_gram();
j=1;
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//在中断回调里调用
{
shibo();
}