一、PWM
使用定时器17的通道1使PA7引脚输出PWM。
STM32CubeMX配置:
系统主频80MHZ,经过(79+1)分频,得到1MHZ,计数值为(999+1),比较值为(299+1),PWM1模式,输出极性为高,则频率为1khz,占空比为30%(小于300,输出高电平)。
注:PWM波的输出不用配置中断。
HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1); // pwm输出
在while循环前调用该函数即可输出波形。
设置PWM波的占空比:__HAL_TIM_SET_COMPARE();
设置PWM波的频率:__HAL_TIM_SET_AUTORELOAD(),一般设置频率时,要使占空比不变,所以,还要重新设置PWM波的占空比。该函数在运行时设置 TIM 自动重新加载寄存器值,而无需再次调用任何 Init 函数。若需要修改频率,需要使能自动重装载寄存器。
二、方波
使用定时器16的通道1使PA6输出方波。
STM32CubeMX配置:
使用定时器输出模式的翻转模式,与设置的比较直相比,若相等则电平翻转一次,并且触发中断,在中断里面在原来的计数值上在加上比较值。
HAL_TIM_OC_Start_IT(&htim16,TIM_CHANNEL_1); // 方波 ,写在while前的初始化
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM16)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, (__HAL_TIM_GET_COUNTER(&htim16)+100)); // 设置比较值
}
HAL_TIM_OC_Start_IT(&htim16,TIM_CHANNEL_1);
}
}
三、波的输入捕获
使用定时器2的通道2是PA1引脚测量波的频率和占空比。
STM32CubeMX配置:
这里信号的输入为通道2,则通道2必须设置为直接输入捕获模式,并且必须选择上升沿触发。通道1选择间接输入捕获模式,选择下升沿触发。
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 输入捕获
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
period_val = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2)+1;
duty_val = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1)+1;
if(period_val)
{
__HAL_TIM_SET_COUNTER(&htim2, 0);
freq = 1000000/ period_val;
duty = (duty_val/period_val)*100;
}
}
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
}
}
注意一定要在每一次捕获数值后,将计数值清0,为下一次捕获做准备。
四、设置PWM波的频率和占空比
①输出频率可调,占空比固定的PWM
每按一次按键1频率增加500hz,每按一次按键2频率减少500hz,并保持占空比不变。
if(key_up==3)
{
pwm7 = freq; // 获取pwm参数
duty7 = 0.1; // duty7 = duty;
pwm7 += 500;
if(pwm7 > 10000)
{
pwm7=10000;
}
pwm7_val = 1000000/pwm7;
pwm7_duty = pwm7_val * 0.1;
__HAL_TIM_SET_AUTORELOAD(&htim3, pwm7_val);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pwm7_duty);
}
这里如果用输入捕获测得的占空比,频率增加越多,占空比误差越多,建议将占空比固定。
ARR值=1000000 / freq; (1000000是系统时钟经过预分配提供给定时器的计数时钟)
占空比 = compare值 / arr值 * 100;
②输出频率可调,占空比可以调的PWM
和①一样的,使用一些函数即可,注意打开使能自动重载载值。
设置PWM波的占空比:__HAL_TIM_SET_COMPARE();
设置PWM波的频率:__HAL_TIM_SET_AUTORELOAD();
③交换两路的PWM的频率和占空比
PA6:1khz,占空比:50%;PA7:0.5khz,占空比:10%。每次按键按下交换频率和占空比。
if(key_up==2)
{
// 获取各PWM的比较值,arr值
pwm6_val = __HAL_TIM_GET_AUTORELOAD(&htim16);
pwm6_duty = __HAL_TIM_GET_COMPARE(&htim16,TIM_CHANNEL_1);
pwm7_val = __HAL_TIM_GET_AUTORELOAD(&htim3);
pwm7_duty = __HAL_TIM_GET_COMPARE(&htim3,TIM_CHANNEL_2);
// PA6-->PA7
__HAL_TIM_SET_AUTORELOAD(&htim16, pwm7_val);
__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, pwm7_duty);
// PA7-->PA6
__HAL_TIM_SET_AUTORELOAD(&htim3, pwm6_val);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pwm6_duty);
}
注意:修改PWM的参数时,打开使能自动重装载值。
小结
判断定时器的通道:HAL_TIM_ACTIVE_CHANNEL_1
定时器的通道:TIM_CHANNEL_1
启动 PWM 信号生成:HAL_TIM_PWM_Start()
在中断模式下启动 TIM 输入捕获测量: HAL_TIM_IC_Start_IT()
在中断模式下启动 TIM 输出比较信号生成:HAL_TIM_OC_Start_IT()
设置定时器比较值(占空比):__HAL_TIM_SET_COMPARE()
设置定时器自动重装载值(频率):__HAL_TIM_SET_AUTORELOAD()
获取定时器计数值:__HAL_TIM_GET_COUNTER()
设置定时器计数值:__HAL_TIM_SET_COUNTER()
获取定时器捕获值:HAL_TIM_ReadCapturedValue()