你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

NUCLEO-STM32F767+PWM呼吸灯

[复制链接]
队长shiwo 发布时间:2017-7-27 21:01
本帖最后由 队长shiwo 于 2017-7-31 17:49 编辑

       脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 tttttt.png
        图中,我们假定定时器工作在向上计数 PWM模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候, IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。
      使用NUCLEO-STM32F767ZI的PB0输出PWM,实现LD1的呼吸灯效果。板子上的PB0可以控制LD1的亮灭,刚好PB0是定时器TIM3的CH3通道,可以用来输出PWM信号 tt.png
ttt.png t.png

CUBEMX配置初始化:
tttt.png ttttt.png

主要代码:
  1. TIM_HandleTypeDef HTIM3;
  2. TIM_OC_InitTypeDef sConfigOC;
  3. /* TIM3 init function,APB1 Clock:108MHz*/
  4. void MX_TIM3_Init(void)
  5. {
  6.     TIM_ClockConfigTypeDef sClockSourceConfig;
  7.     TIM_MasterConfigTypeDef sMasterConfig;
  8.   

  9.   HTIM3.Instance = TIM3;
  10.   HTIM3.Init.Prescaler = 108-1; //预分频值PSC                                108MHz/108=1MHz
  11.   HTIM3.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数
  12.   HTIM3.Init.Period = 500-1;  //自动重装载值ARR                    PWM频率:1MHz/500 =2kHz
  13.   HTIM3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//设置时钟分频因子
  14.   HTIM3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;//
  15.   if (HAL_TIM_Base_Init(&HTIM3) != HAL_OK)//初始化定时器 3
  16.   {
  17.     _Error_Handler(__FILE__, __LINE__);
  18.   }

  19.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;//时钟源使用内部时钟APB1
  20.   if (HAL_TIM_ConfigClockSource(&HTIM3, &sClockSourceConfig) != HAL_OK)
  21.   {
  22.     _Error_Handler(__FILE__, __LINE__);
  23.   }

  24.   if (HAL_TIM_PWM_Init(&HTIM3) != HAL_OK)//初始化PWM
  25.   {
  26.     _Error_Handler(__FILE__, __LINE__);
  27.   }

  28.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  29.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  30.   if (HAL_TIMEx_MasterConfigSynchronization(&HTIM3, &sMasterConfig) != HAL_OK)//
  31.   {
  32.     _Error_Handler(__FILE__, __LINE__);
  33.   }

  34.   sConfigOC.OCMode = TIM_OCMODE_PWM1;//PWM1 Mode
  35.   sConfigOC.Pulse = 0;               //捕获比较值
  36.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;//输出极性高
  37.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; //快速模式
  38.   if (HAL_TIM_PWM_ConfigChannel(&HTIM3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  39.   {
  40.     _Error_Handler(__FILE__, __LINE__);
  41.   }
  42.   HAL_TIM_PWM_Start(&HTIM3, TIM_CHANNEL_3);//开启TIM3通道3的PWM
  43.   
  44.   HAL_TIM_MspPostInit(&HTIM3);
  45.   
  46.   //HAL_TIM_Base_Start_IT(&HTIM3); //使能定时器 3 和定时器 3 更新中断
  47. }

  48. //定时器底册驱动,开启时钟,设置中断优先级
  49. //此函数会被 HAL_TIM_Base_Init()函数调用
  50. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
  51. {

  52.   if(tim_baseHandle->Instance==TIM3)
  53.   {
  54.   /* USER CODE BEGIN TIM3_MspInit 0 */

  55.   /* USER CODE END TIM3_MspInit 0 */
  56.     /* TIM3 clock enable */
  57.     __HAL_RCC_TIM3_CLK_ENABLE();

  58.     /* TIM3 interrupt Init */
  59.     HAL_NVIC_SetPriority(TIM3_IRQn, 1, 1);
  60.     HAL_NVIC_EnableIRQ(TIM3_IRQn);
  61.   /* USER CODE BEGIN TIM3_MspInit 1 */

  62.   /* USER CODE END TIM3_MspInit 1 */
  63.   }
  64. }
  65. //此函数会被 HAL_TIM_PWM_Init()函数调用
  66. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
  67. {
  68.   GPIO_InitTypeDef GPIO_InitStruct;
  69.   if(htim->Instance==TIM3)
  70.   {
  71.   /* USER CODE BEGIN TIM3_MspPostInit 0 */
  72.     __HAL_RCC_TIM3_CLK_ENABLE();
  73.   /* USER CODE END TIM3_MspPostInit 0 */
  74.   
  75.     /**TIM3 GPIO Configuration   
  76.     PB0     ------> TIM3_CH3
  77.     */
  78.     GPIO_InitStruct.Pin = PWM_LD1_Pin;
  79.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;//复用推挽输出
  80.     GPIO_InitStruct.Pull = GPIO_PULLUP;    //上拉
  81.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  82.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
  83.     HAL_GPIO_Init(PWM_LD1_GPIO_Port, &GPIO_InitStruct);

  84.   /* USER CODE BEGIN TIM3_MspPostInit 1 */

  85.   /* USER CODE END TIM3_MspPostInit 1 */
  86.   }
  87. }
  88. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
  89. {

  90.   GPIO_InitTypeDef GPIO_InitStruct;
  91.   if(timHandle->Instance==TIM3)
  92.   {
  93.   /* USER CODE BEGIN TIM3_MspPostInit 0 */

  94.   /* USER CODE END TIM3_MspPostInit 0 */
  95.   
  96.     /**TIM3 GPIO Configuration   
  97.     PB0     ------> TIM3_CH3
  98.     */
  99.     GPIO_InitStruct.Pin = PWM_LD1_Pin;
  100.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;//复用推挽输出
  101.     GPIO_InitStruct.Pull = GPIO_PULLUP;    //上拉
  102.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  103.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
  104.     HAL_GPIO_Init(PWM_LD1_GPIO_Port, &GPIO_InitStruct);

  105.   /* USER CODE BEGIN TIM3_MspPostInit 1 */

  106.   /* USER CODE END TIM3_MspPostInit 1 */
  107.   }

  108. }

  109. void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
  110. {

  111.   if(tim_baseHandle->Instance==TIM3)
  112.   {
  113.   /* USER CODE BEGIN TIM3_MspDeInit 0 */

  114.   /* USER CODE END TIM3_MspDeInit 0 */
  115.     /* Peripheral clock disable */
  116.     __HAL_RCC_TIM3_CLK_DISABLE();

  117.     /* TIM3 interrupt Deinit */
  118.     HAL_NVIC_DisableIRQ(TIM3_IRQn);
  119.   /* USER CODE BEGIN TIM3_MspDeInit 1 */

  120.   /* USER CODE END TIM3_MspDeInit 1 */
  121.   }
  122. }

  123. /* USER CODE BEGIN 1 */

  124. //设置 TIM3 通道 3 的占空比   compare:比较值  //compare/100 * ARR
  125. void TIM_SetTIM3Compare(uint32_t  compare)
  126. {
  127.   TIM3->CCR3=compare;
  128. }
  129. //TIM3,Compare2/100 * ARR
  130. void TIM3_CH3_SetCompare(TIM_TypeDef *TIMx,uint32_t compare)
  131. {
  132.   sConfigOC.Pulse=compare;
  133.   HAL_TIM_PWM_ConfigChannel(&HTIM3,&sConfigOC,TIM_CHANNEL_3);
  134. }

  135. //呼吸灯
  136. uint8_t  LD1_dir = 0;
  137. uint16_t LD1_PWM_Value = 0;
  138. void TIM3_CH3PWM_BreatheLED(void)
  139. {
  140.   if(LD1_dir == 0)
  141.   {
  142.     LD1_PWM_Value ++;
  143.     if(LD1_PWM_Value >= 300)
  144.     {
  145.       LD1_dir = 1;
  146.     }
  147.   }
  148.   else
  149.   {
  150.     LD1_PWM_Value --;
  151.     if(LD1_PWM_Value <= 10)
  152.     {
  153.       LD1_dir = 0;
  154.     }
  155.   }
  156.   TIM_SetTIM3Compare(LD1_PWM_Value);
  157. }
复制代码
放在滴答时钟里面执行的:
  1. uint16_t Breathe_Count;
  2. void SysTick_Handler(void)
  3. {
  4.   /* USER CODE BEGIN SysTick_IRQn 0 */

  5.   /* USER CODE END SysTick_IRQn 0 */
  6.   HAL_IncTick();
  7.   HAL_SYSTICK_IRQHandler();
  8.   /* USER CODE BEGIN SysTick_IRQn 1 */
  9.   TempVref_count++;
  10.   Breathe_Count++;
  11.   if(Breathe_Count >= BREATHE_TIMER)//10ms
  12.   {
  13.     TIM3_CH3PWM_BreatheLED();//呼吸灯
  14.     Breathe_Count = 0;
  15.   }
  16.   /* USER CODE END SysTick_IRQn 1 */
  17. }
复制代码




效果:
2017_07_27_20_50_49.gif



工程代码: NUCLEO-F767ZI.rar (5.49 MB, 下载次数: 79)

评分

参与人数 1 ST金币 +10 收起 理由
zero99 + 10

查看全部评分

收藏 6 评论12 发布时间:2017-7-27 21:01

举报

12个回答
wolfgang 回答时间:2017-7-27 23:39:12
很好,支持~~~
五哥1 回答时间:2017-7-29 17:47:04
五哥1 回答时间:2017-7-31 15:38:49
楼主新增部分能用其他颜色标出吗,这个看了半天,
队长shiwo 回答时间:2017-7-31 17:51:10
五哥1 发表于 2017-7-31 15:38
楼主新增部分能用其他颜色标出吗,这个看了半天,

上传了工程文件,你可以下载来看看,用论坛的代码编辑确实有点参差不齐的
五哥1 回答时间:2017-8-2 01:41:21
谢谢楼主分享
samhong 回答时间:2017-8-2 09:00:13
早上好!谢谢楼主分享!
andey 回答时间:2017-8-2 09:12:05
提示: 作者被禁止或删除 内容自动屏蔽
合肥·宝 回答时间:2018-5-8 20:38:42
厉害了我的哥
lilyliu123 回答时间:2019-5-17 00:23:03
为什么我用keil5编译后有很多错误提示
z123963 回答时间:2019-8-2 19:13:37
很好,支持
傻猪卜爱哭啊 回答时间:2019-8-3 13:35:53
支持,谢谢分享
Ian-392967 回答时间:2020-1-5 13:11:26
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版