[其他ST产品] STM32G0学习手册——使用HAL库进行PWM实验

[复制链接]
 楼主| 大鹏2365 发表于 2023-10-28 23:44 | 显示全部楼层 |阅读模式
前言
在CubeMx中配置PWM,预分频系数和计数的值决定了波形的周期,pulse决定了占空比。

PWM边沿对齐模式(向上计数)

在PWM模式1下,TIMx_CNT<TIMx_CCRx时,PWM参考信号OCxREF为高,否则为低。
8938653d2c4559b13.png


PWM边沿对齐模式(向下计数)

TIMx_CR1中的DIR为1时,执行向下计数。在PWM模式1时,TIMx_CNT>TIMx_CCRx时OCxREF为低,否则为高。

 楼主| 大鹏2365 发表于 2023-10-28 23:53 | 显示全部楼层
PWM模式1与PWM模式2区别
PWM模式1

在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平

在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。

PWM模式2

在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平

在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。


有效电平和无效电平由CCER这个寄存器的CCxP来决定

CC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  

配置为输出:0:OCx高电平有效   1:OCx低电平有效
 楼主| 大鹏2365 发表于 2023-10-28 23:53 | 显示全部楼层
实验步骤
生成一个10ms周期的PWM波形,占空比从10~100.。

CubeMx生成芯片工程,配置SWD调试接口,HSE使用"Crystal/Ceramic Resonator"
PA0引脚配置为GPIO_EXTI0(配置EXTI中断)
 楼主| 大鹏2365 发表于 2023-10-28 23:53 | 显示全部楼层
 楼主| 大鹏2365 发表于 2023-10-28 23:53 | 显示全部楼层
 楼主| 大鹏2365 发表于 2023-10-28 23:55 | 显示全部楼层
PB1引脚配置为TIM3_CH4,在TIM3视图中Clock Source 选择"Internal Clock",Channel4选择"PWM Generation CH4"
预分频系数填6400-1,计数值填100-1。(计算方法)
 楼主| 大鹏2365 发表于 2023-10-28 23:55 | 显示全部楼层
 楼主| 大鹏2365 发表于 2023-10-28 23:56 | 显示全部楼层
 楼主| 大鹏2365 发表于 2023-10-28 23:56 | 显示全部楼层
在工程项目栏中填入项目名称、路径、版本
在代码生成中选择自己需要的选项,最后生成代码
 楼主| 大鹏2365 发表于 2023-10-28 23:56 | 显示全部楼层
在int main函数里面添加pwm初始化代码
  /* USER CODE BEGIN 2 */
        HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
  /* USER CODE END 2 */
 楼主| 大鹏2365 发表于 2023-10-28 23:57 | 显示全部楼层
在int main() { }后面添加EXTI上升沿中断回调函数
  1. /* USER CODE BEGIN 4 */
  2. void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
  3. {
  4.   /* Prevent unused argument(s) compilation warning */
  5.   UNUSED(GPIO_Pin);
  6.         HAL_Delay(20);
  7.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
  8.   {
  9.     if(duty_cycle==0)
  10.       duty_cycle+=10;
  11.     if(duty_cycle==100)
  12.       duty_cycle=-10;
  13.     Set_PWM_DUTYCYCLE(duty_cycle);
  14.     duty_cycle+=duty_cycle;
  15.   }
  16. }
  17. /* USER CODE END 4 */
 楼主| 大鹏2365 发表于 2023-10-28 23:57 | 显示全部楼层
在int main() { }前面添加自定义改变PWM参数的函数
  1. /* USER CODE BEGIN PV */
  2. uint8_t duty_cycle=0;
  3. /* USER CODE END PV */

  4. /* USER CODE BEGIN 0 */
  5. void Set_PWM_DUTYCYCLE(uint8_t duty_cycle)
  6. {
  7.         TIM_OC_InitTypeDef sConfigOC;
  8.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  9.   sConfigOC.Pulse = duty_cycle;
  10.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  11.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  12.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  13.   {
  14.     Error_Handler();
  15.   }
  16.   HAL_TIM_MspPostInit(&htim3);
  17.         HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
  18. }
  19. /* USER CODE END 0 */
 楼主| 大鹏2365 发表于 2023-10-28 23:57 | 显示全部楼层
在debug选项卡中勾上"Reset and Run",编译。烧录
当你不停按下按钮时,就会看到LED等从暗到亮,从亮到暗变化。
 楼主| 大鹏2365 发表于 2023-10-28 23:57 | 显示全部楼层
Uriah 发表于 2024-2-9 07:15 | 显示全部楼层

这些电流环路的布线
帛灿灿 发表于 2024-2-9 09:11 | 显示全部楼层

所有开关电源设计
周半梅 发表于 2024-2-9 12:10 | 显示全部楼层

主从定时器门控的方式
Pulitzer 发表于 2024-2-9 13:13 | 显示全部楼层

在主要开关电源拓扑中主要的电流环路
童雨竹 发表于 2024-2-9 15:09 | 显示全部楼层

当PWM频率较高时,频繁的中断将影响程序运行的效率
Wordsworth 发表于 2024-2-9 16:12 | 显示全部楼层

每个环路要与其他环路分开
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

692

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

61

主题

692

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部