历史上的今天
今天是:2025年08月21日(星期四)
2019年08月21日 | 使用stm32的HAL库完成pwm输入模式测量频率和占空比的详细教程
2019-08-21 来源:eefocus
STM32定时器具有PWM的输入捕获模式。
PWM输入捕获是定时器输入捕获的一个特例,单通道的输入捕获只能获取波形的频率,但是PWM输入捕获可以获取到频率和占空比,对应的高低电平宽度也就能获取到。 它的时序如下图所示:

使用cubemx配置方法:

就是使用TIM2的ch1和ch2来捕获一个pwm信号。

这里只测试了update event,我测试55khz使用该分频与计数值可以正常工作,不过第一次捕获的数据是随机数,需要丢弃。另外这里分频值我改成89的时候不太正常,捕获到的占空比出现错误,更改为0之后正常。这里需要注意的是F429的TIM2是在APB1下,时钟频率90Mhz。而TIM1/TIM8则是在APB2下。


然后使能TIM2的中断
接下来添加代码:
main.c 中开启捕获中断
/* USER CODE BEGIN 2 */
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);//如果不需要占空比和频率数据就只开通道2即可。第一次的数据是不正确的,实际工作中要将第一次的数据丢弃
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (tmp1 == 0)
{
duty = 0;
freq = 0;
}
else
{
duty = tmp2 * 100.0f / tmp1 + 0.5f;
freq = 90000000.0f / tmp1;
}
printf ("freq: %d Hztduty: %d %%rn", freq, duty);
printf ("tmp1: %dt%drn", tmp1, tmp2);
printf ("pos pulse= %lfrn", tmp1 * 1.111111111111111e-8);// 这个1.xe-8就是90M时钟分之一
HAL_Delay(500);
}
/* USER CODE END 3 */
然后添加TIM2的中断回调函数:
/* USER CODE BEGIN 1 */
uint32_t duty = 0;
uint32_t freq = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
volatile static uint32_t tmp1 = 0, tmp2 = 0;
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
tmp1 = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);//周期
}
else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
tmp2 = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);//占空比
}
}
/* USER CODE END 1 */
这里计算出的duty和freq就是占空比和频率,下边加上0.5只是为了四舍五入,不需要的可以去掉。
这里的90000000就是定时器的时钟源,因为我使用的是F429的TIM2且分频值配置的为0, 所以用90000000来除以tmp1就得到频率,如果用其他定时器或者分频值的话需要更改这个90000000为实际的时钟源频率
这里有个问题是,当检测引脚上的PWM信号突然丢失的时候,程序不会将频率和占空比清零。可以添加一个计数值,main中累加,检测中断中清零,当累加到一定的值就表示外部没有pwm输入了,从而判断出外部中断的状态。
史海拾趣
|
不好意思了,刚好出去工作去了,没及时发帖,今早回来赶紧补,要不对不住SOSO姐了,上传几张图,器件是飞思卡尔的MMA7260,具有量程选择和睡眠使能引脚, X Y Z 三个方向的电压 &nb ...… 查看全部问答> |
|
公司想在开发板的基础上对嵌入式主板做些改动,主要是裁剪掉一些不必要的东西,然后换个LCD显示屏,有没有谁认识成都做嵌入式主板的团队或个人给推荐一下。顺便问问。这种项目一般收费是多少?… 查看全部问答> |
|
我想用EVC操作ACCESS数据库,使它能接收检测到的电流电压等值,并将值保存到数据库里面,要怎样做呢?我是新手,拜托各位指点,要是能说得详细点就更好了呵呵… 查看全部问答> |
|
我是一名交通控制研究生,我们实验室主要做交通控制方面的东西,最近老师让我做zigbee通信,而别的同学都在学习vxworks等对找工作很有帮助的东西,我们学校的学术才两年半,我不想浪费时间啊,想学成熟的技术,实用的,对找工作十分有帮助的。我不 ...… 查看全部问答> |
|
msp430f149 usart 谁能告诉我这个程序是什么意思啊 //***************************************************************************** // MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 19200 Echo ISR, 32kHz ACLK // // Description: Echo a received character, ...… 查看全部问答> |
|
430也能玩嵌入式:Contiki内核在IAR+MSP430下移植(四) 但__volatile__不是IAR的关键字,还是有问题,索性改成这样(没加volatile会不会有副作用?): #ifdef __IAR_SYSTEMS_ICC__ #define asmv(arg) __asm(arg) #elif #define asmv(arg) __asm__ __volatile__(arg) #endif ...… 查看全部问答> |




