【整理】STM8使用TIM1测量PWM波

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 【整理】STM8使用TIM1测量PWM波

一基本TIM1测量PWM波形原理

1

根据上图所示测量PWM的基本思想如下:
每个上升沿开始计数,监测到下降沿时记录下当前值为高电平时间,再检测到一个下降沿记录下当前值为周期,同时清零计数器开始测量下个周期。

二TIM1 的硬件结构
1 信号如何输入的
打开手册 翻到  17.5.2 输入模块

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输入端的重同步电路。

3

三 寄存器
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;
}
原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 【整理】STM8使用TIM1测量PWM波

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: