1、芯片输出PWM波形步骤
1.0主函数
int main(void){ HAL_Init(); //初始化HAL库 Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M delay_init(72); //初始化延时函数 uart_init(115200); //初始化串口 LED_Init(); //初始化LED TIM1_PWM_Init(20000,72); //72分频,即1M 。 1000000/20000 = 50 Hz ,即20ms while(1) { TIM_SetTIM1Compare1(1500); } }12345678910111213
1.1初始化输出PWM波形的定时器和IO口(例程使用定时器1的通道1,输出在PA8)
GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM1_CLK_ENABLE(); //使能定时器1__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 GPIO_Initure.Pin=GPIO_PIN_8; //PA8GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速HAL_GPIO_Init(GPIOA,&GPIO_Initure); 12345678
1.2初始化定时器1,HAL库中,使用定时器的 PWM 输出功能时, HAL 库为我们提供了一个独立的定时器初始化函数 HAL_TIM_PWM_Init ()
TIM_HandleTypeDef TIM1_Handler; //定时器句柄 TIM1_Handler.Instance=TIM1; //定时器1TIM1_Handler.Init.Prescaler=psc; //定时器分频TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式TIM1_Handler.Init.Period=arr; //自动重装载值TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(&TIM1_Handler); //初始化PWM123456789
1.3初始化通道并开启PWM
TIM_OC_InitTypeDef TIM1_CH1Handler; //定时器1通道1句柄TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1TIM1_CH1Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高 HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH1Handler,TIM_CHANNEL_1);//配置TIM1通道1 HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1);//开启PWM通道1123456
1.4提供设置比较值的函数
//设置TIM1通道1的占空比//compare:比较值void TIM_SetTIM1Compare1(u32 compare){ TIM1->CCR1=compare; } 123456
2、输出PWM原理及代码解释
设置PWM周期和一个比较值,技术过程中比较值和计数值进行比较,判断输出有效电平还是无效电平,达到输出PWM波的目的。
如图CRRx是比较值,ARR是重装值(达到该值重装为0)
2.1时钟和IO口初始化略。
2.2在定时器初始化中。
TIM1_Handler.Init.Prescaler=psc; //定时器分频
//所述分频将时钟频率分为更小的频率,如STM32F103是设置72M的时钟频率,设置psc=72分频,得到1M时钟频率。
TIM1_Handler.Init.Period=arr; //自动重装载值
//在设置arr=20000重装初值,由公式1M/20000=50Hz,即周期T=20ms 。
TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
此时得到的是20ms就重装初值的定时器。
2.3在通道1初始化及PWM开启代码中
TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
//选择的PWM模式:PWM模式1:计数值<比较值时输出有效电平,计数值>比较值输出无效电平。
TIM1_CH1Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高,设置有效电平是高电平还是低电平。
3、总结
本文章主要讲述了HAL库输出PWM波形的代码编写,提供了改变比较值的函数,使用户可以动态的改变PWM并行占空比。
1、芯片输出PWM波形步骤
1.0主函数
int main(void){ HAL_Init(); //初始化HAL库 Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M delay_init(72); //初始化延时函数 uart_init(115200); //初始化串口 LED_Init(); //初始化LED TIM1_PWM_Init(20000,72); //72分频,即1M 。 1000000/20000 = 50 Hz ,即20ms while(1) { TIM_SetTIM1Compare1(1500); } }12345678910111213
1.1初始化输出PWM波形的定时器和IO口(例程使用定时器1的通道1,输出在PA8)
GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM1_CLK_ENABLE(); //使能定时器1__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 GPIO_Initure.Pin=GPIO_PIN_8; //PA8GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速HAL_GPIO_Init(GPIOA,&GPIO_Initure); 12345678
1.2初始化定时器1,HAL库中,使用定时器的 PWM 输出功能时, HAL 库为我们提供了一个独立的定时器初始化函数 HAL_TIM_PWM_Init ()
TIM_HandleTypeDef TIM1_Handler; //定时器句柄 TIM1_Handler.Instance=TIM1; //定时器1TIM1_Handler.Init.Prescaler=psc; //定时器分频TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式TIM1_Handler.Init.Period=arr; //自动重装载值TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(&TIM1_Handler); //初始化PWM123456789
1.3初始化通道并开启PWM
TIM_OC_InitTypeDef TIM1_CH1Handler; //定时器1通道1句柄TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1TIM1_CH1Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高 HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH1Handler,TIM_CHANNEL_1);//配置TIM1通道1 HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1);//开启PWM通道1123456
1.4提供设置比较值的函数
//设置TIM1通道1的占空比//compare:比较值void TIM_SetTIM1Compare1(u32 compare){ TIM1->CCR1=compare; } 123456
2、输出PWM原理及代码解释
设置PWM周期和一个比较值,技术过程中比较值和计数值进行比较,判断输出有效电平还是无效电平,达到输出PWM波的目的。
如图CRRx是比较值,ARR是重装值(达到该值重装为0)
2.1时钟和IO口初始化略。
2.2在定时器初始化中。
TIM1_Handler.Init.Prescaler=psc; //定时器分频
//所述分频将时钟频率分为更小的频率,如STM32F103是设置72M的时钟频率,设置psc=72分频,得到1M时钟频率。
TIM1_Handler.Init.Period=arr; //自动重装载值
//在设置arr=20000重装初值,由公式1M/20000=50Hz,即周期T=20ms 。
TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
此时得到的是20ms就重装初值的定时器。
2.3在通道1初始化及PWM开启代码中
TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
//选择的PWM模式:PWM模式1:计数值<比较值时输出有效电平,计数值>比较值输出无效电平。
TIM1_CH1Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高,设置有效电平是高电平还是低电平。
3、总结
本文章主要讲述了HAL库输出PWM波形的代码编写,提供了改变比较值的函数,使用户可以动态的改变PWM并行占空比。
举报