目录
概述
1 PWM 输入模式
1.1 原理介绍
1.2 应用实例
1.3 示例时序图
2 使用STM32Cube配置工程
2.1 软件环境
2.2 配置参数
2.3 生成项目文件
3 功能实现
3.1 PWM占空比函数
3.2 输入捕捉回调函数
4 功能测试
4.1 测试软件框架结构
4.2 实验实现
4.2.1 测试实验1
4.2.2 测试实验2
STM32高级控制定时器(STM32F103):PWM 输入模式,测速pwm的占空比,频率参数
源代码下载地址:
STM32高级控制定时器(STM32F103):PWM输入模式资源-CSDN文库
概述
本文主要介绍STM32高级定时器的用法至输入捕获功能,该功能可用于捕捉外部输入信号的频率,并且计算出PWM的占空比。笔者通过详细的案例介绍这个功能,包括理论知识,实现原理,以及如何使用STM32Cube配置基本的参数,编写实用代码,实现捕捉频率当的功能。
1 PWM 输入模式
1.1 原理介绍
这种模式是输入捕获模式的一种特殊情况。程序相同,只是:
1)两个ICx信号映射在同一个TIx输入上
2)这2个ICx信号在具有相反极性的边缘上是活动的
3)选择两个TIxFP信号中的一个作为触发输入和从模式控制器在重置模式下配置。
1.2 应用实例
用户可以测量周期(在TIMx_CCR1寄存器中)和占空比(在TIMx_CCR2寄存器)使用以下程序(取决于在CK_INT频率和预分频器值上):
1)选择TIMx_CCR1的激活输入:将CC1S位写入TIMx_CCMR1中的01寄存器(选择TI1)。
2)选择TI1FP1的有效极性(用于TIMx_CCR1和计数器中的捕获清除):将CC1P位写入“0”(上升沿激活)。
3)选择TIMx_CCR2的激活输入:将CC2S位写入TIMx_CCMR1中的10寄存器(选择TI1)。
4)选择TI1FP2的有效极性(用于TIMx_CCR2中的捕获):写入CC2P位到“1”(在下降沿上有效)。
5) 选择有效的触发输入:将TS位写入TIMx_SMCR寄存器中的101(已选择TI1FP1)。
6) 在重置模式下配置从属模式控制器:将SMS位写入TIMx_SMCR寄存器。
7) 启用捕获:将CC1E和CC2E位写入TIMx_CCER寄存器中的“1”。
1.3 示例时序图
PWM输入模式只能与TIMx_CH1/TIMx_CH2信号一起使用,因为只有TI1FP1和TI2FP2连接到从模式控制器。
2 使用STM32Cube配置工程
2.1 软件环境
软件名称 | 版本信息 |
---|---|
STM32Cube | STM32CubeMX 6.11 |
STM32 HAL | STM32Cube_FW_F1_V1.8.5 |
2.2 配置参数
1)配置系统时钟:72M Hz,Timer的工作时钟为72M Hz
2) 使用定时器1配置输入捕获功能
其对应的IO口配置
计数器时钟参数和捕获通道参数
3)配置PWM相关参数
选择定时器8作为控制PWM的输出
PWM波对应的IO接口
Timer-8定时器相关参数
和PWM相关的参数配置
2.3 生成项目文件
使用STM32FCube完成项目配置后,就可以生成工程文件。生成代码如下:
3 功能实现
3.1 PWM占空比函数
在tim.c文件中实现配置输出PWM占空比函数,函数代码如下:
参数介绍
1)Pluse: 占空比
2)Channel: 输出通道号
void HAL_TIM_SetPWM_Pulse( uint32_t Pulse, uint32_t Channel)
{
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = Pulse;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, Channel) != HAL_OK)
{
Error_Handler();
}
}
3.2 输入捕捉回调函数
在input_capture.c实现输入捕捉回调函数。
函数功能介绍
1)计算输入的PWM的频率
2)计算输入的PWM的周期
3)计算输入的PWM的占空比
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
uint32_t uwIC2Value1 = 0;
uint32_t uwIC2Value2 = 0;
uint32_t cycle,pluse,freq;
static uint32_t uwIC2Value2_list[2];
static uint8_t count = 0;
float dutyfactor;
if(htim->Instance == TIM1)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
/* Get the 1st Input Capture value */
}
else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
/* Get the 1st Input Capture value */
uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
if( uwIC2Value2 > uwIC2Value1)
{
pluse = uwIC2Value2- uwIC2Value1;
uwIC2Value2_list[count] = uwIC2Value1;
count++;
if( count == 2 )
{
count = 0;
if( uwIC2Value2_list[1] > uwIC2Value2_list[0])
{
cycle = uwIC2Value2_list[1]- uwIC2Value2_list[0];
freq = 1000000/cycle;
dutyfactor = (pluse*100)/cycle;
printf("PWM cycle = %d us, PWM freq = %d Hz\r\n", cycle, freq);
printf("PWM dutyfactor = %d%s\r\n", (int)dutyfactor,"%");
}
}
}
}
}
}
4 功能测试
4.1 测试软件框架结构
4.2 实验实现
PWM的工作的使用频率为1us, 一个PWM的周期为10 000 us, 通过调制Pulse的值就可以改变占空比,其中每一个Plus表示1us,举个例子:
设置Pluse = 500, 表示占空比为:500/10000 *100 % = 5%
4.2.1 测试实验1
1)配置PWM参数,输出频率为100Hz,占空比为5%
void pwm_ctrl_Init( void )
{
HAL_TIM_Base_Start( &htim8 );
HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1); // PC6
HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2); // PC7
HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_1);
HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_2);
}
2)配置输入捕捉电平信号触发类型
void Input_CaptureInit( void )
{
set_captureMode(TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);
set_captureMode(TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
}
3) 编译代码,下载到板卡运行,结果如下:
逻辑分析仪测试到的波形
调试终端打印的数据log:
4.2.2 测试实验2
1)配置PWM参数,输出频率为100Hz,占空比为50%
void pwm_ctrl_Init( void )
{
HAL_TIM_Base_Start( &htim8 );
HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1); // PC6
HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2); // PC7
HAL_TIM_SetPWM_Pulse( 5000, TIM_CHANNEL_1);
HAL_TIM_SetPWM_Pulse( 5000, TIM_CHANNEL_2);
}
2) 编译代码,下载到板卡运行,结果如下:
逻辑分析仪测试到的波形
调试终端打印的数据log: