历史上的今天
今天是:2024年09月03日(星期二)
2021年09月03日 | STM8使用TIM1测量PWM波
2021-09-03 来源:eefocus
一基本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)
1 2 | TIM1->CCMR1 |=0x02;// ch1到ti2fp1 TIM1->CCMR2 |=0x01;// ch1到ti2fp1 |
2设置捕获极性
信号已经连到IC1 IC2了,那么下一步就该对IC1 IC2进行配置了。顺着目录往下看跟捕获相关的寄存器还有CCERx
通过阅读描述了解该为可控制ICx的捕获边沿极性和使能。
实验中的配置如下
1 | TIM1->CCER1 |= 0x13;//使能输入捕获ti2fp1 ti2fp2 ti2fp1下降沿捕获 ti2fp2上升沿捕获 |
3触发模式
从模式控制寄存器SMCR中可选择复位模式和 触发源
1 | TIM1->SMCR |=0X64;//选源触发源 ti2fp2 触发方式 复位模式 |
最后使能下中断配置就大功搞成咯
1 | TIM1->IER |=0x06;//使能中断ch1 ch2 |
四 测试程序 STVD
将PWM波注入CH2引脚。在中断返回前设置断点,然后进行仿真,
将IC2Value,IC1Value;放入watch窗口观察。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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; } |
史海拾趣
|
艾克赛尔(Axelwave)无线网络――无线监控在高速公路的应用 近年来中国经济的飞速发展,使中国的公路建设,尤其是高速公路的建设上了一个新台阶。而随着现代化高速公路的建设,新一代高速公路视频监控系统,日益成为高速公路监管的重要手段。无线监控凭借其简便、快速、受环境影响小的特点,也逐步成为高速公 ...… 查看全部问答> |
|
在基于软件无线电的某无线通信信号侦收平台的设计中,天线接收到的信号经过变频器处理和A/D变换之后,经过高速通道把采集的信号送入主控板进行数据分发处理。系统的结构框图如图1所示。 图1 主控板的系统结构框图 主控板的硬件核 ...… 查看全部问答> |
|
SIM300C是一款内嵌TCP/IP协议的GPRS模块。 可以使用他直接连接互联网,最近做的一个项目中使用到这个模块 AT+CREG? +CREG: 0,1 OK AT+CGATT? +CGATT: 1 OK Delay 120 seconds AT+CIPSTART=”TCP”,”211.145.35.45”,”2020” ...… 查看全部问答> |
|
wince提供的api只能录制成wave吧? 录成mp3需要使用开源的lame库? 我现在在模拟器上能录制成wave, 调用lame库把wave转成mp3不成功,似乎是lame库内存异常了. 哪位大侠有CE5.0下能用的lame库? 或者还有其它方式能直接录成mp3? 我的邮箱:victor_20 ...… 查看全部问答> |
|
signal abc: std_logic_vector(5 downto 0):=(others=>\'0\');困扰很久,一直不明白。哪位大侠能给详解一下?谢谢!… 查看全部问答> |
|
各位大侠pointer to different objects怎么解决 我用xdata 数据指针定义如下 struct course xdata * xdata course1;struct course xdata * xdata course2;struct course xdata * xdata course3;struct course xdata * xdata course4;volatile struct course xdata * xdata course[4]; ...… 查看全部问答> |
|
大家好, 请教一下网络设备(路由器、交换机等)接地若干问题: 1、设备配置三相电源插头,插座也接地了,请问一下电源接地的目的是避雷么?还是其他作用? 2、设备机壳有接地标识;机壳接地的作用是什么?是防止静电么? 3、设备安装到机柜内 ...… 查看全部问答> |
|
搬实验室,出东西啦,WIFI TFT LCD ARM M4等 搬实验室,出东西啦,WIFI TFT LCD ARM M4等 qq 84321999 注明eeword 额,东西太多, 价格感兴趣的加QQ聊吧,… 查看全部问答> |




