控制/MCU
在使用单片机对脉冲信号进行捕获时,经常会使用到单片机的捕获功能。 今天,我们讲解一下关于GD32F103C系列单片机的PWM捕获功能。 使用定时器2的通道2-PA6(TIMER2_CH0)作为PWM脉冲捕获口,进行脉冲捕获。
引脚定义
1、定时器配置
timer_init.prescaler = 107;//分频系数,最终分频Fre=108M/(108M-1)+1=1M
timer_init.alignedmode = TIMER_COUNTER_EDGE;//选择边缘对其模式
timer_init.counterdirection = TIMER_COUNTER_UP;//向上计数
timer_init.period = 65535;//定时器装载值,计数值超出后会产生溢出中断
timer_init.clockdivision = TIMER_CKDIV_DIV1;//不分割
timer_init.repetitioncounter = 0;//重复计数,重复溢出多少次才会溢出中断,此处配置为0,不重复
timer_init(TIMER2,&timer_init);//使能定时器
timer_init.icpolarity = TIMER_IC_POLARITY_RISING;//上升沿触发模式
timer_init.icselection = TIMER_IC_SELECTION_DIRECTTI;//通道直连
timer_init.icprescaler = TIMER_IC_PSC_DIV1;//无预分频器,捕获输入口检测到的每一个边沿都会触发一次捕获
timer_init.icfilter = 0x0;//无滤波器
timer_input_config(TIMER2,TIMER_CH_0,&timer_init);//使能捕获配置
2、原理讲解
PWM信号频率捕获时需要考虑两种情况,一种是周期在设定的period内,不会触发溢出中断; 另外一种是频率较低,会远远超出一个定时器周期,并触发溢出中断。
不会触发溢出中断的情况
TH就是我们设定的period值65535,主频时108M,分频后为1M,所以定时器溢出中断时间为:T=1/1M*65535=0.065535s。 假设第一种情况,捕获到第一次高电平时,T0=count_value1,捕获到第2次高电平时T1=count_value2,那么count=count_value2-count_value1;
count_value1 = TIMER2_CH0CV(TIMER2);
count_value2 = TIMER2_CH0CV(TIMER2);
count=count_value2-count_value1;
触发溢出中断的情况
第2种情况,由于频率较低,所以当捕获到第2次高电平时,已触发了定时器溢出中断,所以需要加上溢出中断部分。 溢出中断次数计为OverVal,从图中看两次高电平之间OverVal次数为2,那么总的计数count=(OverVal*TH-count_value1)+count_value2。
uint16_t OverVal = 0;//溢出次数
uint16_t Freq = 0;//频率
count = (OverVal*TH-count_value1)+count_value2;
Freq =1/T= 1/(1/1M*count)=1M/count;
全部0条评论
快来发表一下你的评论吧 !