当前位置:   article > 正文

STM32利用标准库编写同时输出4路PWM信号的程序(Proteus)仿真

STM32利用标准库编写同时输出4路PWM信号的程序(Proteus)仿真

先看看结果:

这个是根据上午发的文章的基础上更改的,很简单,只是用了一个定时器,初始化了4个比较器而已,就可以单独的控制每一路PWM的占空比了,好了,把源文件展示一下,完事去接孩子放学。

PWM.c文件:

  1. #include "stm32f10x.h" // Device header
  2. void PWM_Init(void)
  3. {
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  6. TIM_InternalClockConfig(TIM2);
  7. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  8. TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  9. TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  10. TIM_TimeBaseInitStruct.TIM_Period = 100-1;
  11. TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;
  12. TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
  13. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
  14. TIM_OCInitTypeDef TIM_OCInitStruct;
  15. TIM_OCStructInit(&TIM_OCInitStruct);
  16. TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
  17. TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
  18. TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
  19. TIM_OCInitStruct.TIM_Pulse = 0;
  20. TIM_OC1Init(TIM2, &TIM_OCInitStruct);
  21. TIM_OC2Init(TIM2, &TIM_OCInitStruct);
  22. TIM_OC3Init(TIM2, &TIM_OCInitStruct);
  23. TIM_OC4Init(TIM2, &TIM_OCInitStruct);
  24. GPIO_InitTypeDef GPIO_InitStruct;
  25. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  26. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3;
  27. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  28. GPIO_Init(GPIOA, &GPIO_InitStruct);
  29. TIM_Cmd(TIM2, ENABLE);
  30. }
  31. // 设置PWM的函数,第一个参数是第几个比较器的意思, 第二个参数是这个比较器的值是多少?
  32. void SET_PWM(uint16_t num, uint16_t key)
  33. {
  34. if(num == 1)
  35. {
  36. TIM_SetCompare1(TIM2, key);
  37. }
  38. if(num == 2)
  39. {
  40. TIM_SetCompare2(TIM2, key);
  41. }
  42. if(num == 3)
  43. {
  44. TIM_SetCompare3(TIM2, key);
  45. }
  46. if(num == 4)
  47. {
  48. TIM_SetCompare4(TIM2, key);
  49. }
  50. }

PWM.h文件:

  1. #ifndef __PWM_H
  2. #define __PWM_H
  3. void PWM_Init(void);
  4. void SET_PWM(uint16_t num, uint16_t key);
  5. #endif

main.c主函数文件:

  1. #include "stm32f10x.h" // Device header
  2. #include "OLED.h"
  3. #include "PWM.h"
  4. int main(void)
  5. {
  6. OLED_Init(); //oled 屏幕初始化
  7. PWM_Init();
  8. SET_PWM(1, 10); //设置通道1的占空比为10%
  9. SET_PWM(2, 20); //设置通道2的占空比为20%
  10. SET_PWM(3, 30); //设置通道3的占空比为30%
  11. SET_PWM(4, 40); //设置通道4的占空比为40%
  12. while(1)
  13. {
  14. }
  15. }

其实整个过程只是增加了一个函数而已:这个函数就是:

好了,自己理解吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/305137?site
推荐阅读
相关标签
  

闽ICP备14008679号