Posted: 2020-08-18
Status:
Completed
Previous:
STM32硬件层HAL库高级定时器PWM输出HAL篇9
Timers->TIM3配置Internal ClockPWM Generation CH1PWM Generation CH2PWM Generation CH3PWM Generation CH4Parameter Settings配置71,自动重载数值——99,计数模式——UP,自动重载预装载——Enable CKD-No DivisionPWM Mode 1, Pulse——50,Output compare preload——Enable,Fast Mode——Disable,CH Polarity——HighPWM Mode 1, Pulse——40,Output compare preload——Enable,Fast Mode——Disable,CH Polarity——HighPWM Mode 1, Pulse——30,Output compare preload——Enable,Fast Mode——Disable,CH Polarity——HighPWM Mode 1, Pulse——20,Output compare preload——Enable,Fast Mode——Disable,CH Polarity——HighGENERATE CODE自动生成代码void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState)tim.c文件添加函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* USER CODE BEGIN 1 */
/**
* @brief 控制PWM频率
* @param freq 频率
* @param duty1 通道1占空比
* @param duty2 通道2占空比
* @param duty3 通道3占空比
* @param duty4 通道4占空比
* @retval 无
*/
void Set_General_PWM_FREQ(uint16_t freq,uint8_t duty1,uint8_t duty2,uint8_t duty3,uint8_t duty4)
{
uint16_t count=1000000/freq;
__HAL_TIM_SET_AUTORELOAD(&htim3, count-1);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,count*duty1/100);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,count*duty2/100);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,count*duty3/100);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,count*duty4/100);
}
/* USER CODE END 1 */
tim.h文件添加函数定义1
2
3
/* USER CODE BEGIN Prototypes */
void Set_General_PWM_FREQ(uint16_t freq,uint8_t duty1,uint8_t duty2,uint8_t duty3,uint8_t duty4);
/* USER CODE END Prototypes */
main.c文件添加变量1
2
uint32_t freq;
uint8_t duty1,duty2,duty3,duty4;
1
2
3
4
5
6
7
8
9
TIM_CCxChannelCmd(TIM3,TIM_CHANNEL_1,TIM_CCx_ENABLE);//使能通道1
TIM_CCxChannelCmd(TIM3,TIM_CHANNEL_2,TIM_CCx_ENABLE);//使能通道2
TIM_CCxChannelCmd(TIM3,TIM_CHANNEL_3,TIM_CCx_ENABLE);//使能通道3
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);//使能通道4,并开启定时器
freq=10000;
duty1=50;
duty2=40;
duty3=30;
duty4=20;
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
freq-=1000;
if(freq<=1000)
{
freq=10000;
}
duty1+=10;
duty2-=10;
duty3+=5;
duty4-=5;
if(duty1>=100)
{
duty1=10;
}
if(duty2<=10)
{
duty2=100;
}
if(duty3>=100)
{
duty3=5;
}
if(duty4<=5)
{
duty4=100;
}
Set_General_PWM_FREQ(freq,duty1,duty2,duty3,duty4);