一基本TIM1测量PWM波形原理
根据上图所示测量PWM的基本思想如下:
每个上升沿开始计数,监测到下降沿时记录下当前值为高电平时间,再检测到一个下降沿记录下当前值为周期,同时清零计数器开始测量下个周期。
二TIM1 的硬件结构
1 信号如何输入的
打开手册 翻到 17.5.2 输入模块
如图61,输入部分对相应的TIx输入信号采样,并产生一个滤波后的信号TIxF。然后,一个带极性选择的边缘监测器产生一个信号(TIxFPx),它可以作为触发模式控制器的输入触发或者作为捕获控制。该信号通过预分频进入捕获寄存器(ICxPS)。
根据该图和说明了解到和PWM测量相关的信息
1) TIM1有四个外部IO引脚可以输入信号 TIM1_CHx
2) 我们所关注的边沿检测是通过中间的边缘监测器检测出来的
3) 一个输入信号的上升沿 下降沿信号(TI1FP1,TI1FP2)可以配置到不同的通道上
那么我们就可以将一个引脚输入的PWM信号的上升沿和下降沿分别送入两个通道捕获。
2触发
如果是用的普通的计时器例如古董51的话,计时器清零的步骤就可以在上升沿中断的时候手动清零,不过STM8 的TIM1有个复位触发模式很适用:
计数器开始依据内部时钟计数,然后正常计数直到TI1出现一个上升沿;此时,计数器被清零然后从0重新开始计数。同时,触发标志(TIM1_SR1寄存器的TIF位)被置位,如果使能了中断(TIM1_IER寄存器的TIE位),则产生一个中断请求。 下图显示当自动重装载寄存器TIMx_ARR=0x36时的动作。在TI1上升沿和计数器的实际复位之间的延时取决于TI1输入端的重同步电路。
三 寄存器
1配置信号输入路径
点击手册目录 从TIM1寄存器描述的目录中找 输入捕获相关的寄存器。
这里发现有4个CCMRx正好和框图中四个TIM输入通道对应上了。通过介绍了解 位1:0是用来控制信号输入路径的。
我的实验板上信号输入的引脚是TH2,那么就该把TH2分成两路分别连接到TIM1的两个通道上(IC1,IC2)
TIM1->CCMR1 |=0x02;// ch1到ti2fp1 TIM1->CCMR2 |=0x01;// ch1到ti2fp1
2设置捕获极性
信号已经连到IC1 IC2了,那么下一步就该对IC1 IC2进行配置了。顺着目录往下看跟捕获相关的寄存器还有CCERx
通过阅读描述了解该为可控制ICx的捕获边沿极性和使能。
实验中的配置如下
TIM1->CCER1 |= 0x13;//使能输入捕获ti2fp1 ti2fp2 ti2fp1下降沿捕获 ti2fp2上升沿捕获
3触发模式
从模式控制寄存器SMCR中可选择复位模式和 触发源
TIM1->SMCR |=0X64;//选源触发源 ti2fp2 触发方式 复位模式
最后使能下中断配置就大功搞成咯
TIM1->IER |=0x06;//使能中断ch1 ch2
四 测试程序 STVD
将PWM波注入CH2引脚。在中断返回前设置断点,然后进行仿真,
将IC2Value,IC1Value;放入watch窗口观察。
void TIME1_INIT(void) { TIM1_DeInit(); //时基单元 //时钟触发控制器 TIM1->SMCR |=0X64;//选源触发源 ti2fp2 和触发方式 复位 //捕获 比较 TIM1->CCMR1 |=0x02;// ch1到ti2fp1 TIM1->CCMR2 |=0x01;// ch1到ti2fp1 TIM1->CCER1 |= 0x13;//使能输入捕获ti2fp1 ti2fp2 ti2fp1下降升沿 ti2fp2上升沿 //中断 TIM1->IER |=0x06;//使能中断ch1 ch2 TIM1_Cmd(ENABLE); } void main(void) { TIME1_INIT(); // 定时器1 输入捕获初始化 enableInterrupts(); // 开总中断 while(1); } 中断函数 extern unsigned int IC2Value,IC1Value; @near @interrupt void TIM1_CAP_COM_IRQHandler (void) { if(TIM1_GetITStatus(TIM1_IT_CC1)) { IC1Value=TIM1_GetCapture1(); //读取高电平时间 TIM1_ClearITPendingBit(TIM1_IT_CC1); } if(TIM1_GetITStatus(TIM1_IT_CC2)) { TIM1_ClearITPendingBit(TIM1_IT_CC2); IC2Value=TIM1_GetCapture2(); //读取周期 } return; }
文章的脚注信息由WordPress的wp-posturl插件自动生成