一、GD32E513定时器输入模式
通用定时器 L0 拥有四个独立的通道用于捕获输入或比较输出是否匹配。每个通道都围绕一个通道捕获比较寄存器建立,包括一个输入级,通道控制器和输出级。
捕获模式允许通道测量一个波形时序,频率,周期,占空比等。输入级包括一个数字滤波器,一个通道极性选择,边沿检测和一个通道预分频器。如果在输入引脚上出现被选择的边沿, TIMERx_CHxCV 寄存器会捕获计数器当前的值,同时 CHxIF 位被置 1,如果 CHxIE = 1 则产生通道中断。
通 道 输 入 信 号 CIx 有 两 种 选 择 , 一 种 是 TIMERx_CHx 信 号 , 另 一 种 是TIMERx_CH0,TIMERx_CH1 和 TIMERx_CH2 异或之后的信号。通道输入信号 CIx 先被TIMER_CK 信号同步,然后经过数字滤波器采样,产生一个被滤波后的信号。通过边沿检测器,可以选择检测上升沿或者下降沿。通过配置 CHxP 选择使用上升沿或者下降沿。配置CHxMS.,可以选择其他通道的输入信号,内部触发信号。配置 IC 预分频器,使得若干个输入事件后才产生一个有效的捕获事件。捕获事件发生, CHxVAL 存储计数器的值。
配置步骤如下:
第一步: 滤波器配置(TIMERx_CHCTL0 寄存器中 CHxCAPFLT):
根据输入信号和请求信号的质量,配置相应的 CHxCAPFLT。
第二步: 边沿选择(TIMERx_CHCTL2 寄存器中 CHxP):
配置 CHxP 选择上升沿或者下降沿。
第三步: 捕获源选择(TIMERx_CHCTL0 寄存器中 CHxMS):
一旦通过配置 CHxMS 选择输入捕获源,必须确保通道配置在输入模式(CHxMS!=0x0),而且TIMERx_CHxCV 寄存器不能再被写。
第四步: 中断使能(TIMERx_DMAINTEN 寄存器中 CHxIE 和 CHxDEN):
使能相应中断,可以获得中断和 DMA 请求。
第五步: 捕获使能(TIMERx_CHCTL2 寄存器中 CHxEN)。
结果: 当期望的输入信号发生时, TIMERx_CHxCV 被设置成当前计数器的值, CHxIF 为置 1。如果 CHxIF 位已经为 1,则 CHxOF 位置 1。根据 TIMERx_DMAINTEN 寄存器中 CHxIE 和CHxDEN 的配置,相应的中断和 DMA 请求会被提出。
直接产生: 软件设置 CHxG 位,会直接产生中断和 DMA 请求。
通道输入捕获功能也可用来测量 TIMERx_CHx 引脚上信号的脉冲波宽度。例如,一个 PWM波连接到 CI0。配置 TIMERx_CHCTL0 寄存器中 CH0MS 为 2’ b01,选择通道 0 的捕获信号为 CI0 并设置上升沿捕获。配置 TIMERx_CHCTL0 寄存器中 CH1MS 为 2’ b10,选择通道 1捕获信号为 CI0 并设置下降沿捕获。计数器配置为复位模式,在通道 0 的上升沿复位。TIMERX_CH0CV 寄存器测量 PWM 的周期值, TIMERx_CH1CV 寄存器测量 PWM 占空比值。
GD32E513通过TIMERx_CHCTL0的CH0CAPFLT[3:0]进行通道 0 输入捕获滤波,CI0 输入信号可以通过数字滤波器进行滤波,该位域配置滤波参数。
数字滤波器的基本原理:根据 fSAMP 对 CI0 输入信号进行连续采样,并记录信号相同电平的次数。达到该位配置的滤波参数后,认为是有效电平。
滤波器参数配置如下:
fDTS是数字滤波器的采样频率,通过TIMER_CTL0的CKDIV[1:0]配置
二、用GD32E513的正交译码功能配置磁编码器
void encoder_timer_config(void)
{
timer_parameter_struct timer_initpara;
timer_ic_parameter_struct timer_icinitpara;
timer_deinit(TIMER2);
timer_initpara.prescaler = 0;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 4095;
timer_initpara.clockdivision = 0;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER2, &timer_initpara);
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
timer_icinitpara.icfilter = 8;
timer_input_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);
timer_icinitpara.icfilter = 15;
timer_input_capture_config(TIMER2, TIMER_CH_2, &timer_icinitpara);
timer_quadrature_decoder_mode_config(TIMER2,TIMER_QUAD_DECODER_MODE2,TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_RISING);
timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH2);
timer_interrupt_enable(TIMER2, TIMER_INT_CH2);
timer_enable(TIMER2);
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/colin_128988/article/details/148494010
|