1、引言
单片机:STM32F407ZGT6;
仿真器:ST Link V2;
开发环境:STM32CubeIDE 1.10.1;
功能说明:使用单片机定时器产生PWM实现呼吸灯效果。
前情提要:
STM32Cube学习(1)——点灯&配置
STM32Cube学习(2)——定时器中断
STM32Cube学习(3)——ADC
STM32Cube学习(4)——UART串口
参考资料:
【STM32】HAL库 STM32CubeMX教程七—PWM输出(呼吸灯)
STM32F4数据手册
2、STM32CubeIDE配置
选择TIM14通道,使能Channel1为PWM(因为开发板LED管脚是这个)
在参数设置中,配置如下
Counter Settings计数器配置:
Prescaler(分频器)——71
Counter Mode(计数器模式)——Up
Counter Period(计数器周期)——499
auto-reload preload(自动重载初值)——使能
PWM Generation Channel 1:
Pulse(初始脉冲)——0
Output compare preload(输出比较预加载)——使能
CH Polarity(通道极性)——Low
关于PWM频率的计算公式如下
式中:
fpwm为pwm工作频率;
clk为定时器频率72MHz
arr为计数器值499
psc为预分配值71
计算可知,PWM频率为2000Hz
占空比通过修改CCR1得到,计算公式为arr/CCR1,如50%占空比,即arr=499;CCR1=250;
3、代码
以下代码参考“Z小旋”
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM14_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim14,TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim14, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
HAL_Delay(1);
}
if(pwmVal<=500)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim14, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
HAL_Delay(1);
}
HAL_Delay(200);
}
/* USER CODE END 3 */
}