使用STM32的PWM波实现呼吸灯效果

文章目录

  • 实验环境
  • 一、PWM工作原理
  • 1.基本特性
  • 2.PWM两个基本参数
  • 3.PWM信号电压调节原理
  • 4.PWM输出工作原理
  • 二、HAL库配置
  • 1.TIM3、4通道引脚分布
  • 2.TIM配置
  • 3.时钟RCC配置
  • 4.项目配置
  • 三、项目代码修改
  • 四、STM32F103C8开发板接线
  • 五、程序运行结果
  • 六、总结

  • 实验环境

    软件:
    STM32CubeMX
    KEIL5
    mcuisp
    串口通信助手
    硬件:
    STM32F103C8Tx
    杜邦线,面包板,USB转TTL


    一、PWM工作原理

    1.基本特性

    脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。广泛应用于电机控制、灯光的亮度调节、功率控制等领域。

    2.PWM两个基本参数

    周期(Period): 一个完整PWM波形所持续的时间
    占空比(Duty): 高电平持续时间(Ton)与周期时间(Period)的比值
    占空比计算公式: Duty = ( Ton / Period ) x 100%

    3.PWM信号电压调节原理

    4.PWM输出工作原理

    功能单元 功能
    输入捕获单元 用于捕获外部触发信号,捕获方式为上升沿/下降沿/双边沿捕获。发生捕获事件时,将此刻计数器的值锁存到捕获/比较寄存器中,供用户读取,同时可以产生捕获中断。
    捕获/比较寄存器 TIMx_CCR寄存器在输入捕获模式下用于存放发生捕获事件时的当前计数值;在输出比较模式下用于存放预设的比较值。该寄存器具备预装载功能。
    输出比较单元 用于信号输出。定时器通过将预设的比较值与计数器的值做匹配比较,以实现各类输出,如PWM输出、单脉冲输出等。预设的比较值存放在捕获/比较寄存器中。

    二、HAL库配置

    1.TIM3、4通道引脚分布

    2.TIM配置

    (1)配置定时器3。如图,位置1选中定时器3;位置2选择时钟源为“Internal Clock”,通道2选择“PWM Generation CH2”

    位置3设置分频系数为71,计数周期为500,其它默认。
    位置4设置占空比初始值为10,其实这里不写也没影响。

    (2)TIM4同理配置,如图

    3.时钟RCC配置

    (1)打开外部时钟,点击“System Core”,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”。

    (2)系统时钟选择HSE,PLL锁相环倍频9倍,系统时钟来源选择为PLL,置APB1分频器为 /2

    4.项目配置

    (1)选择项目名称,选择IDE为MDK-ARM

    (2)选择复制所有库文件到项目当中

    三、项目代码修改

    1.修改工程。打开工程,主要修改main.c文件。定义一个变量,用来存储占空比:

    代码:

    uint16_t duty_num = 10;	//占空比
    int flag = 0;	//逐亮或逐暗标志
    

    2.开始TIM2的通道3,4,输出PWM。

    代码:

    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);	//打开tim3的通道2
    HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);	//打开tim4的通道2
    

    3.编写PWM波形生成函数
    每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),将标志flag置1,减少占空比,如果小于10,将标志flag置0,增加占空比

    void TIM34_PWM()
    {
    	  HAL_Delay(30);	//延时30ms
    		if(flag==0)
    		{
    			duty_num = duty_num + 10;	//当flag=2时将占空比增加10
    		}
    		if(flag==1)
    		{
    			duty_num = duty_num - 10;	//当flag=1时将占空比减少10
    		}
    		
    		if(duty_num > 500)
    		{
    			flag=1;	//将标志转为逐暗
    		}
    		if(duty_num < 10)
    		{
    			flag=0;	//将标志转为逐亮
    		}
    		__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,duty_num);	//配置PWM波形
    		__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_2,duty_num);
    		
      }
    

    4.修改while循环中的代码

     while (1)
      {
    		
    		TIM34_PWM();//调用PWM波生成函数
      }
    

    修改后,保存,编译、下载,重新上电。可以看到外设LED以及最小开发板自带的LED,从亮倒暗,逐渐变化。

    四、STM32F103C8开发板接线

    根据设计的程序连接电路:
    对于USB转TTL模块和stm32f103c8t6连接:
    GND — GND
    3v3 — 3v3
    TXD — A10
    RXD — A9

    总电路:
    红——A7
    B7——C13

    五、程序运行结果

    程序烧录运行后,查看外设LED灯以及最小开发板自带LED的状态

    这样通过PWM制作的呼吸灯就完成了

    六、总结

    PWM(脉冲宽度调制)控制技术——通过 对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。根据拟合波形的频率、幅值和半周期脉冲数,准确计算 PWM 波各脉冲宽度和间隔,据此控制开关器件的通断,就可得到所需 PWM 波形,再将PWM波形通过引脚输出,就可以实现呼吸灯,通过这种思想也可以用来控制电机转速。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用STM32的PWM波实现呼吸灯效果

    发表回复