点灯~可以说是每一个入行的朋友第一个要学的东西,流水灯,呼吸灯,律动灯各种各样的点灯折磨着新手。
控制灯的亮灭通常用两种方式,一种是利用DAC输出可调的电压,另一种则是 利用PWM波调节方波的占空比来实现灯的亮暗
,本期我们就使用STM32来实现输出PWM波使LED灯的亮度发生变换。
打开CubeMX,创建新的工程,选择我们的板子芯片型号。
将连接LED的IO设置为PWM模式,如果没有PWM模式,我们也可以通过定时器来模拟PWM模式。
配置好高速时钟和低速时钟(根据自己的板子来配置)
配置好时钟树。
定时器打开PWM模式
配置相关参数,时钟频率/(分频系数+1)就是定时器的一秒计数,到达重装载值的时候就会触发定时器中断,当我们选择模式一的时候,当计数值高于Pulse比较值是有效电平,有效电平由CH
Polarity决定。
因此当我们希望输出1KHZ的方波的时候,就可以设置分频系数为167,计数值为1000,设置Pulse为500,即为占空比50%。
接着设置工程的基本信息,使用MDK编程。
分离.C和.H文件,之后创建工程。
接着在主程序中写上启动PWM的函数。
也可以利用这个函数来改变PWM的占空比。
while (1) { /* USER CODE END WHILE */ for(int i = 0;i<1000;i++) { __HAL_TIM_SET_COMPARE(&htim14,TIM_CHANNEL_1,i); HAL_Delay(1); } for(int i = 1000;i>0;i--) { __HAL_TIM_SET_COMPARE(&htim14,TIM_CHANNEL_1,i); HAL_Delay(1); } /* USER CODE BEGIN 3 */ }
利用上述代码,改变PWM的占空比即可实现呼吸灯。
** 效果展示 ** 当然有可能我们的IO没有PWM模式,我们也可以通过定时器来实现PWM模式。 首先是随便设置一个定时器。
打开定时器中断。 之后创建我们的工程,在初始化中开启定时器中断。
HAL_TIM_Base_Start_IT(&htim1);
然后编写对应的中断回调函数,在中断回调函数中我们模拟PWM波的实现。
int number = 0;int Pulse = 50;//初始的Pulse为50则为占空比50%void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if (htim->Instance == TIM1) { number ++; if(number 》100) { number = 0; } if(number<Pulse) { HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,0); } else { HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,1); } }}
在循环函数中添加呼吸灯的实现。
while (1) { /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ for(int i = 0;i<100;i++) { Pulse = i; HAL_Delay(10); } for(int i = 100;i>0;i--) { Pulse = i; HAL_Delay(10); } }
效果展示 ** 下期介绍串口的重定向 **