【stm32/CubeMX、HAL库】嵌入式实验五:定时器(2)|PWM输出

发布于:2024-05-24 ⋅ 阅读:(189) ⋅ 点赞:(0)

参考:

【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p=13&share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3

嵌入式系统基础与实践》刘黎明等编著,第九章定时器,PWM从P289开始。

【【STM32教程】入门教程(基于HAL库+CubeMX+MDK-ARM)】 https://www.bilibili.com/video/BV1y7411m7gg/?share_source=copy_web&vd_source=9332b8fc5ea8d349a54c3989f6189fd3

定时器引脚映射

https://blog.csdn.net/weixin_54015326/article/details/135920496

参看上面的文章或者查看手册(8.3.7):

实验内容

2、PWM 输出设计。时钟频率为 72Mhz,采用定时器,PWM 输出。

(1)设计 0.1 毫秒延时,设计占空比 50%,全彩灯 RGB_R.

RGB_R引脚PB13,根据上图,使用TIM1_CH1N通道。

 下面的CH polarity选择LOW,pulse设为50,表示占空比为50%(50%=50/(100-1+1))

 

 注意要确认时PB13作为通道复用的引脚

 

无需写其他代码。

(2)设置 KB1 调整占空比,5 级调整,循环按键。

KB1对应引脚PE0,设置内部上拉,按下为低电平,设置为下降沿触发中断:

 勾选该通道的中断,抢占优先级设为1:

 中断回调函数:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	HAL_Delay(10);//延时,用来消抖
	
  if(GPIO_Pin==GPIO_PIN_0) {
		
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_0)==RESET){
		  
	   pwm_val=levels[mindex];
			mindex=(mindex+1)%5;
			HAL_Delay(1);
		}
	}
	    
	flag=1;
	
}

 主函数:注意开启CH1N的PWM输出跟一般定时器写法不一样,请看:

https://www.bilibili.com/read/cv22069045/

普通的启动:

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) 
//定时器 PWM 输出启动函数

 

  /* USER CODE BEGIN 2 */

	
	/* 定时1互补输出PWM */
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
	
	
	__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

if(flag==1){
		__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwm_val);
		HAL_Delay(1);
		flag=0;
		}
    /* USER CODE END WHILE */
		
		
  }

(3)设计全彩灯 RGB_R 呼吸渐变效果。

大部分和(2)一样,注释掉(2)在while里的部分,添加:

while(pwm_val<100){
		    pwm_val++;
		    __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwm_val);
			  HAL_Delay(1);
		}
		while(pwm_val){
		    pwm_val--;
		    __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwm_val);
			  HAL_Delay(1);
		}
		
		HAL_Delay(200);

实现简单的呼吸效果。


网站公告

今日签到

点亮在社区的每一天
去签到