Posted
: 2020-08-18
Status
:
Completed
Previous
:
STM32硬件层HAL库高级定时器PWM输出HAL篇9
Timers
->TIM3
配置Internal Clock
PWM Generation CH1
PWM Generation CH2
PWM Generation CH3
PWM Generation CH4
Parameter Settings
配置71
,自动重载数值——99
,计数模式——UP
,自动重载预装载——Enable
CKD-No Division
PWM Mode 1
, Pulse——50
,Output compare preload——Enable
,Fast Mode——Disable
,CH Polarity——High
PWM Mode 1
, Pulse——40
,Output compare preload——Enable
,Fast Mode——Disable
,CH Polarity——High
PWM Mode 1
, Pulse——30
,Output compare preload——Enable
,Fast Mode——Disable
,CH Polarity——High
PWM Mode 1
, Pulse——20
,Output compare preload——Enable
,Fast Mode——Disable
,CH Polarity——High
GENERATE 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);