一、概念理解
pwm输入捕获模式是输入捕获模式的特例,自己理解如下:
1. 每个定时器有四个输入捕获通道ic1、ic2、ic3、ic4。且ic1 ic2一组,ic3 ic4一组。并且可是设置管脚和寄存器的对应关系。
2. 同一个tix输入映射了两个icx信号。
3. 这两个icx信号分别在相反的极性边沿有效。
4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个pwm周期(即连续的两个上升沿或下降沿)”,它等于包含tim时钟周期的个数(即捕获寄存器中捕获的为tim的计数个数n)。
6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)
7. 由此可以计算出pwm的时钟周期和占空比了
frequency=f(tim时钟频率)/n。
duty cycle=(高电平计数个数/n),
若m为高电平计数个数,则duty cycle=m/n
若m为低电平计数个数,则duty cycle=(n-m)/n
注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的 最小频率= tim时钟频率/65535。
二、程序设计与分析
1. 程序概述:选择tim3作为pwm输入捕获。ic2设置为上升沿,并设置为有效的触发输入信号。所以ic2的捕获寄存器捕获pwm周期,ic1的捕获寄存器捕获pwm的高电平周期。
2.程序代码如下:
rcc_apb1periphclockcmd(rcc_apb1periph_tim3, enable);//时钟配置
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);
gpio_initstructure.gpio_pin = gpio_pin_7;//gpio配置pio_initstructure.gpio_mode = gpio_mode_in_floating;gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioa, &gpio_initstructure);
nvic_initstructure.nvic_irqchannel = tim3_irqn;//nvic配置nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;nvic_initstructure.nvic_irqchannelsubpriority = 1;nvic_initstructure.nvic_irqchannelcmd = enable;nvic_init(&nvic_initstructure);
tim_icinitstructure.tim_channel = tim_channel_2;//通道选择tim_icinitstructure.tim_icpolarity = tim_icpolarity_rising;//上升沿触发tim_icinitstructure.tim_icselection = tim_icselection_directti;//管脚与寄存器对应关系tim_icinitstructure.tim_icprescaler = tim_icpsc_div1;//输入预分频。意思是控制在多少个输入周期做一次捕获,如果
//输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,
//可以减少软件被不断中断的次数。tim_icinitstructure.tim_icfilter = 0x0;//滤波设置,经历几个周期跳变认定波形稳定0x0~0xf
tim_pwmiconfig(tim3, &tim_icinitstructure);//根据参数配置tim外设信息
tim_selectinputtrigger(tim3, tim_ts_ti2fp2);//选择ic2为始终触发源
tim_selectslavemode(tim3, tim_slavemode_reset);//tim从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
tim_selectmasterslavemode(tim3, tim_masterslavemode_enable); //启动定时器的被动触发
tim_cmd(tim3, enable);//启动tim2
tim_itconfig(tim3, tim_it_cc2, enable);//打开中断
中断处理函数
void tim3_irqhandler(void){tim_clearitpendingbit(tim3, tim_it_cc2);//清楚tim的中断待处理位
ic2value = tim_getcapture2(tim3);//读取ic2捕获寄存器的值,即为pwm周期的计数值
if (ic2value != 0){ dutycycle = (tim_getcapture1(tim3) * 100) / ic2value;//读取ic1捕获寄存器的值,并计算占空比
frequency = 72000000 / ic2value;//计算pwm频率。}else{dutycycle = 0;frequency = 0;}}
注(一):若想改变测量的pwm频率范围,可将tim时钟频率做分频处理
tim_timebasestructure.tim_period = 0xffff;//周期0~fffftim_timebasestructure.tim_prescaler = 5;//时钟分频,分频数为5+1即6分频tim_timebasestructure.tim_clockdivision = 0;//时钟分割tim_timebasestructure.tim_countermode = tim_countermode_up;//模式tim_timebaseinit(tim2, &tim_timebasestructure);//基本初始化注注(二):定时器tim的倍频器x1或x2。在apb分频为1时,倍频值为1,否则为2。
笔记:之前调试的时候,想检测低频,按照上面方法进行分频处理时,怎么都不行,后来才搞明白,由于检测时要进行计数,印记预装载值tim_period还是要设置成0xffff,而tim_prescaler是进行分频用的,也就是说,如果定时器时钟为72m,则将tim_prescaler设置成5后,tim的时钟为14.4m,此时可以检测的最小频率=14.4m/0xffff,也就是说最小检测频率=14.4m/tim_period。
同欣智能科技M1PS英开关介绍
电动汽车与燃油车相比安全性能如何
全球液晶电视面板出货量在2017年逐季上升
超级简单单片机红外感应开关DIY设计
下一年苹果新iPhone显示器供应商会花落谁家?
如何用定时器来捕获PWM脉冲频率
2023物联网+智慧生活创新应用论坛即将开幕,机智云物联网邀您共赴盛会!
小米VR亮相,小米在VR领域的布局将公布
微软推出ARM平台二合一平板电脑Surface Pro X,不标配键盘和笔
大胆预测2006年关于Google的15条新闻
玻璃生产锅炉液位信号无线远传系统的组成与功能
区块链应用举例车联网去中心化认证协议 区块链信任机制赋能
小米MIX 4曝光将配备陶瓷机身设计并搭载一亿像素传感器
空客全资子公司正式成立 MulticoreWare与Melexis达成合作
尚立获华为3镜头大单,Q4进入出货高峰期
电感元件的反电动势分析
亚信科技推出了5G场景计费服务器系统
基于Altera的FPGA器件和VHDL语言实现数据采集系统的设计
IMX6 MfgTool烧录指导手册
LG计划在华设OLED面板厂 地点花落广州