首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【蓝桥杯——物联网设计与开发】基础模块9 - PWM

  • 25-03-06 11:41
  • 2633
  • 14046
blog.csdn.net

目录

一、PWM

(1)资源介绍

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

二、PWM接口函数封装

三、踩坑日记

(1)PWM输出测量不准

(2)PWM模式

(3)实训平台PWM测量困难


一、PWM

(1)资源介绍

        PWM(Pulse Width Modulation)​脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

图1        PWM周期与脉宽

        其中,脉宽时间即高电平时间;

        单片机的 IO 口输出的是数字信号,其仅能输出高电平和低电平这两种状态,假设高电平为 5V,低电平为 0V。当我们需要输出不同的模拟电压时,就会用到 PWM 技术。其原理是通过改变 IO 口输出方波的占空比,以此来获取由数字信号模拟而成的模拟电压信号。

图2        有效电压
  • PWM是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压;
  • PWM频率越高,响应越快;

以上资料来源于:

PWM原理 PWM频率与占空比详解-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/as480133937/article/details/103439546        在蓝桥杯物联网竞赛实训平台中,提供了两个电机接口 P1 和 P2,由达林顿管 ULN2803 驱动。因为达林顿管是反向驱动,所以在调节占空比时,需要注意取值。

图3        板极资源

(2)STM32CubeMX 软件配置


?“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️

【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出icon-default.png?t=O83Ahttp://iyenn.com/rec/1715909.html?spm=1001.2014.3001.5502

1️⃣配置引脚 PA0 为 TIM2_CH1,引脚 PA1 为 TIM2_CH2;(此时引脚呈黄色状态)

     点击 "Timers" → 点击"TIM2"→将"Clock Source"配置为 "Internal Clock" → 将"Channel1" 和 "Channel2"分别配置为 "PWM Generation CH1" 和 "PWM Generation CH2";(此时引脚呈绿色状态);

     修改参数:

  • Counter Settings - Prescaler:31(32分频,使定时器时钟为1MHz);
  • Counter Settings - Counter Period:9999(计数值10000,即PWM频率为100kHz);



2️⃣配置OLED;

3️⃣生成代码即可;

(3)代码编写

?️main 函数

  1. /* USER CODE BEGIN PV */
  2. uint8_t cnt_key;
  3. uint8_t cnt_oled;
  4. uint8_t puc_oled[17]; // oled显示缓存区
  5. uint8_t pwm_duty; // pwm占空比
  6. /* USER CODE END PV */
  7. /**
  8. * @brief The application entry point.
  9. * @retval int
  10. */
  11. int main(void)
  12. {
  13. /* USER CODE BEGIN 1 */
  14. /* USER CODE END 1 */
  15. /* MCU Configuration--------------------------------------------------------*/
  16. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  17. HAL_Init();
  18. /* USER CODE BEGIN Init */
  19. /* USER CODE END Init */
  20. /* Configure the system clock */
  21. SystemClock_Config();
  22. /* USER CODE BEGIN SysInit */
  23. /* USER CODE END SysInit */
  24. /* Initialize all configured peripherals */
  25. MX_GPIO_Init();
  26. MX_I2C3_Init();
  27. MX_TIM2_Init();
  28. /* USER CODE BEGIN 2 */
  29. OLED_Init();
  30. /* PWM启动 */
  31. HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  32. HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
  33. /* USER CODE END 2 */
  34. /* Infinite loop */
  35. /* USER CODE BEGIN WHILE */
  36. while (1)
  37. {
  38. Task_Key();
  39. Task_OLED();
  40. /* USER CODE END WHILE */
  41. /* USER CODE BEGIN 3 */
  42. }
  43. /* USER CODE END 3 */
  44. }
  45. void Task_Key(void)
  46. {
  47. uint8_t key_temp, key_down;
  48. static uint8_t key_old = 0;
  49. if(cnt_key < 10) return;
  50. cnt_key = 0;
  51. key_temp = Key_Read();
  52. key_down = key_temp & (key_temp ^ key_old);
  53. key_old = key_temp;
  54. if(key_down)
  55. {
  56. /* 按键按下,占空比+5 */
  57. pwm_duty += 5;
  58. if(pwm_duty > 100)
  59. pwm_duty = 0;
  60. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm_duty * 100);
  61. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwm_duty * 100);
  62. }
  63. }
  64. void Task_OLED(void)
  65. {
  66. if(cnt_oled < 200) return;
  67. cnt_oled = 0;
  68. sprintf((char*)puc_oled, "PWM_DUTY:%d ", pwm_duty);
  69. OLED_ShowString(0, puc_oled);
  70. }

(4)实验现象

        按键按下后,测得 PA0 和 PA1 引脚输出有变动;


二、PWM接口函数封装

?️修改自动重载值和比较值函数

  1. /* 设置TIM2自动重装值 */
  2. void TIM2_SetReload(uint16_t usData)
  3. {
  4. __HAL_TIM_SET_AUTORELOAD(&htim2, usData);
  5. }
  6. /* 设置TIM2比较值1 */
  7. void TIM2_SetCompare1(uint16_t usData)
  8. {
  9. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, usData);
  10. }
  11. /* 设置TIM2比较值2 */
  12. void TIM2_SetCompare2(uint16_t usData)
  13. {
  14. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, usData);
  15. }

三、踩坑日记

(1)PWM输出测量不准

        ?这个可能与达林顿管有一定关系,在单片机设计与开发赛道中,同样会有这个问题;

(2)PWM模式

        ?PWM有两个模式:

  • 模式1:TIMX_CNT<TIMX_CCRX,输出有效电平;
  • 模式2:TIMX_CNT>TIMX_CCRX,输出有效电平;

        可以通过调节PWM模式和有效电平极性输出不同的PWM波,适应不同电路;

(3)实训平台PWM测量困难

        ?一般检验PWM波,需要使用示波器,一根接地线,一根接PWM波线;

        在实训平台上,PWM产生引脚处,旁边是5V电压,而地线需要从拓展接口引出,操作较为麻烦;后续新的实训平台解决了这一问题;

注:本文转载自blog.csdn.net的逝灮的文章"https://blog.csdn.net/m0_63116406/article/details/144791900"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top