找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1594|回复: 2
打印 上一主题 下一主题
收起左侧

求一个8路STM32 PWM输出程序

[复制链接]
跳转到指定楼层
楼主
ID:168840 发表于 2017-3-8 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求一个8路PWM输出程序
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:167652 发表于 2017-3-8 17:07 | 只看该作者
你可以去开源电子网上面找找,正点原子的板子
回复

使用道具 举报

板凳
ID:169021 发表于 2017-3-8 19:05 | 只看该作者
给你一个:
  1. /**
  2. * \brief grant add here. timer module to generate 8 channal PWM output.
  3. * \date
  4. *
  5. * PWM Channal pin mapping:
  6. *
  7. * PC9 - TIM8_CH4     --->  PWM1
  8. * PC8 - TIM8_CH3     --->  PWM2
  9. * PC7 - TIM8_CH2     --->  PWM3
  10. * PC6 - TIM8_CH1     --->  PWM4

  11. * PB6 - TIM4_CH1     --->  PWM5
  12. * PB7 - TIM4_CH2     --->  PWM6
  13. * PB8 - TIM4_CH3     --->  PWM7
  14. * PB9 - TIM4_CH4     --->  PWM8
  15. *
  16. **/
  17. #include "timer.h"
  18. #include "stm32f10x.h"


  19. /**
  20.   * PWM: frequency = 250hz.
  21.   */
  22. #define PWM_FREQENCY  4000

  23. #define PWM_OUTPUT_CH       8
  24. #define PWM_PATTERN_NUM     5


  25. static const uint8_t PWM_DutyCycle_Array[PWM_OUTPUT_CH][PWM_PATTERN_NUM] ={

  26.     {0, 95, 90, 30, 90},  // TIM8_CH4
  27.     {0, 65, 80, 40, 90},  // TIM8_CH3
  28.     {0, 40, 60, 50, 90},  // TIM8_CH2
  29.     {0, 40, 50, 60, 90},  // TIM8_CH1

  30.     {0, 50, 40, 70, 90},  // TIM4_CH1
  31.     {0, 60, 30, 80, 90},  // TIM4_CH2   
  32.     {0, 70, 20, 90, 90},  // TIM4_CH3  
  33.     {0, 80, 10, 100, 90}, // TIM4_CH4  
  34. };



  35. static void timer4_PWM_GpioInit(void)
  36. {
  37.     GPIO_InitTypeDef GPIO_InitStructure;
  38.    
  39.     /* 设置TIM4CLK为72MHZ */
  40.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  41.     /* GPIOB clock enable, Enable AFIO function */
  42.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  43.    
  44.     /* PB6,7,8,9 -> timer4: Config to PWM output mode */
  45.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;            // 复用推挽输出
  46.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47.    
  48.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  49.     GPIO_Init(GPIOB, &GPIO_InitStructure);   
  50. }


  51. static void timer8_PWM_GpioInit(void)
  52. {
  53.     GPIO_InitTypeDef GPIO_InitStructure;
  54.    
  55.     /* 设置TIM8CLK为72MHZ */
  56.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

  57.     /* GPIOC clock enable, Enable AFIO function */
  58.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);

  59.     /* PC8,9: Config to PWM output mode */
  60.     /*GPIOB Configuration: TIM8 channel 3 and 4 as alternate function push-pull */
  61.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;            // 复用推挽输出
  62.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  63.    
  64.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  65.     GPIO_Init(GPIOC, &GPIO_InitStructure);         
  66. }


  67. static void timer8_PWM_Init(void)
  68. {
  69.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  70.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  71.    
  72.     TIM_DeInit(TIM8);
  73.     //TIM_InternalClockConfig(TIM8);  
  74.    
  75.     /* Time base configuration */   
  76.     TIM_TimeBaseStructure.TIM_Prescaler = 71;        // prescaler = 71, TIM_CLK = 72MHZ/(71+1) = 1MHZ.   
  77.     TIM_TimeBaseStructure.TIM_Period = PWM_FREQENCY -1 ;         // 当定时器从0计数到999,即为1000次,为一个定时周期
  78.                                                     // pwm F = 1MHZ/(3999+1) = 250HZ.  
  79.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;    //设置时钟分频系数:不分频(这里用不到)
  80.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  81.     TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
  82.    
  83.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;       //配置为PWM模式1
  84.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平

  85.     /* PWM1 Mode configuration: Channel4 */
  86.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  87.     TIM_OCInitStructure.TIM_Pulse = (PWM_DutyCycle_Array[0][0] * PWM_FREQENCY )/100;            //设置通道4的电平跳变值,输出另外一个占空比的PWM
  88.     TIM_OC4Init(TIM8, &TIM_OCInitStructure);                        //使能通道4
  89.     TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);

  90.     /* PWM1 Mode configuration: Channel3 */
  91.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  92.     TIM_OCInitStructure.TIM_Pulse = (PWM_DutyCycle_Array[1][0] * PWM_FREQENCY )/100;            //设置通道4的电平跳变值,输出另外一个占空比的PWM
  93.     TIM_OC3Init(TIM8, &TIM_OCInitStructure);                        //使能通道3
  94.     TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);
  95.    
  96.     /* PWM1 Mode configuration: Channel2 */
  97.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  98.     TIM_OCInitStructure.TIM_Pulse = (PWM_DutyCycle_Array[2][0] * PWM_FREQENCY )/100;            //设置通道4的电平跳变值,输出另外一个占空比的PWM
  99.     TIM_OC2Init(TIM8, &TIM_OCInitStructure);                        //使能通道2
  100.     TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);

  101.     /* PWM1 Mode configuration: Channel1 */
  102.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  103.     TIM_OCInitStructure.TIM_Pulse = (PWM_DutyCycle_Array[3][0] * PWM_FREQENCY )/100;            //设置通道4的电平跳变值,输出另外一个占空比的PWM
  104.     TIM_OC1Init(TIM8, &TIM_OCInitStructure);                        //使能通道1
  105.     TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);
  106.    
  107.     TIM_ARRPreloadConfig(TIM8, ENABLE);                                // 使能TIM8重载寄存器ARR

  108.     /* TIM8 enable counter */
  109.     TIM_Cmd(TIM8, ENABLE);                   // 使能定时器8   
  110.     TIM_CtrlPWMOutputs(TIM8, ENABLE);        // 注意: 配置定时器8的PWM模式,必须加上这句话!!
  111. }

  112. static void timer4_PWM_Init(void)
  113. {
  114.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  115.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  116.    
  117.     TIM_InternalClockConfig(TIM4);  
  118.    
  119.     /* Time base configuration */   
  120.     TIM_TimeBaseStructure.TIM_Prescaler = 71;        // prescaler = 71, TIM_CLK = 72MHZ/(71+1) = 1MHZ.   
  121.     TIM_TimeBaseStructure.TIM_Period = PWM_FREQENCY -1 ;         // 当定时器从0计数到999,即为1000次,为一个定时周期
  122.                                                     // pwm F = 1MHZ/(3999+1) = 250HZ.  
  123.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;    //设置时钟分频系数:不分频(这里用不到)
  124.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  125.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  126.    
  127.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;       //配置为PWM模式1
  128.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平

  129.     /* PWM1 Mode configuration: Channel1 */
  130.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  131.     TIM_OCInitStructure.TIM_Pulse = (PWM_DutyCycle_Array[4][0] * PWM_FREQENCY )/100;            //设置通道4的电平跳变值,输出另外一个占空比的PWM
  132.     TIM_OC1Init(TIM4, &TIM_OCInitStructure);                        //使能通道1
  133.     TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

  134.     /* PWM1 Mode configuration: Channel2 */
  135.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  136.     TIM_OCInitStructure.TIM_Pulse = (PWM_DutyCycle_Array[5][0] * PWM_FREQENCY )/100;            //设置通道4的电平跳变值,输出另外一个占空比的PWM
  137.     TIM_OC2Init(TIM4, &TIM_OCInitStructure);                        //使能通道2
  138.     TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
  139.    
  140.    
  141.     /* PWM1 Mode configuration: Channel3 */
  142.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  143.     TIM_OCInitStructure.TIM_Pulse = (PWM_DutyCycle_Array[6][0] * PWM_FREQENCY )/100;            //设置通道4的电平跳变值,输出另外一个占空比的PWM
  144.     TIM_OC3Init(TIM4, &TIM_OCInitStructure);                        //使能通道3
  145.     TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

  146.     /* PWM1 Mode configuration: Channel4 */
  147.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  148.     TIM_OCInitStructure.TIM_Pulse = (PWM_DutyCycle_Array[7][0] * PWM_FREQENCY )/100;            //设置通道4的电平跳变值,输出另外一个占空比的PWM
  149.     TIM_OC4Init(TIM4, &TIM_OCInitStructure);                        //使能通道4
  150.     TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

  151.     TIM_ARRPreloadConfig(TIM4, ENABLE);                                // 使能TIM3重载寄存器ARR

  152.     /* TIM4 enable counter */
  153.     TIM_Cmd(TIM4, ENABLE);                                         //使能定时器4  
  154. }


  155. static void PWM_SetDutyCycle(TEST_PATTERN test_pattern)
  156. {   
  157.     TIM_SetCompare4(TIM8, (( PWM_DutyCycle_Array[0][test_pattern] * (PWM_FREQENCY/100))));
  158.     TIM_SetCompare3(TIM8, (( PWM_DutyCycle_Array[1][test_pattern] * (PWM_FREQENCY/100))));
  159.     TIM_SetCompare2(TIM8, (( PWM_DutyCycle_Array[2][test_pattern] * (PWM_FREQENCY/100))));
  160.     TIM_SetCompare1(TIM8, (( PWM_DutyCycle_Array[3][test_pattern] * (PWM_FREQENCY/100))));
  161.    
  162.     TIM_SetCompare1(TIM4, (( PWM_DutyCycle_Array[4][test_pattern] * (PWM_FREQENCY/100))));
  163.     TIM_SetCompare2(TIM4, (( PWM_DutyCycle_Array[5][test_pattern] * (PWM_FREQENCY/100))));   
  164.     TIM_SetCompare3(TIM4, (( PWM_DutyCycle_Array[6][test_pattern] * (PWM_FREQENCY/100))));
  165.     TIM_SetCompare4(TIM4, (( PWM_DutyCycle_Array[7][test_pattern] * (PWM_FREQENCY/100))));
  166. }

  167. void PWM_GpioInit(void)
  168. {
  169.     timer8_PWM_GpioInit();
  170.     timer4_PWM_GpioInit();
  171. }

  172. void PWM_TimerInit(void)
  173. {
  174.     timer8_PWM_Init();     
  175.     timer4_PWM_Init();  
  176. }

  177. void PWM_RunPattern(TEST_PATTERN *p_test_pattern)
  178. {
  179.     TEST_PATTERN test_pattern;
  180.     test_pattern = *p_test_pattern;
  181.    
  182.     PWM_SetDutyCycle(test_pattern);
  183. }
复制代码

评分

参与人数 1黑币 +5 收起 理由
金属狂潮 + 5 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表