9回答

1收藏

GD32F190定时器的使用-PWM占空比的调节

GD32 GD32 9142 人阅读 | 9 人回复 | 2016-06-04

收到小红版GD32F190后一直没有发帖分享,最近比较懒!。。。学习190的板子也还是老套路,先是建立一个模板工程,之后点灯……这些都没有什么难度,就不发帖子了。需要注意的是190的结构和STM32还是有点区别的,时钟的设置略有差别。这次想拿小红板用来控制电机,因此PWM是必不可少的。由于没有示波器,就拿LED用来验证占空比是否改变。
以下是定时器2的初始化设置部分代码:

另外,在使用小红版的过程中,频繁出现小红板与电脑断开连接的问题,一开始以为是数据线的问题,换过几根数据线后,并没有解决问题,应该是小红版的问题,不知道是否和usbhub芯片的发热有关。
  1. void TIMER_Configuration(void)
  2. {
  3.     /* -----------------------------------------------------------------------
  4.     TIMER2 Configuration: generate 3 PWM signals with 3 different duty cycles:
  5.     TIMER2CLK = SystemCoreClock / 72 = 1MHz

  6.     TIMER2 Channel2 duty cycle = (4000/ 16000)* 100  = 25%
  7.     TIMER2 Channel3 duty cycle = (8000/ 16000)* 100  = 50%
  8.     TIMER2 Channel4 duty cycle = (12000/ 16000)* 100 = 75%
  9.     ----------------------------------------------------------------------- */
  10.           GPIO_InitPara GPIO_InitStructure;
  11.     TIMER_BaseInitPara TIMER_TimeBaseStructure;
  12.     TIMER_OCInitPara  TIMER_OCInitStructure;
  13.           NVIC_InitPara NVIC_InitStructure;

  14.         
  15.           RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOB, ENABLE);
  16.     /* TIMERS clock enable */
  17.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_TIMER1|RCC_APB2PERIPH_TIMER15|RCC_APB2PERIPH_TIMER16|RCC_APB2PERIPH_TIMER17,ENABLE);
  18.     RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER2|RCC_APB1PERIPH_TIMER3|RCC_APB1PERIPH_TIMER6|RCC_APB1PERIPH_TIMER14,ENABLE);
  19.    
  20.             /*Configure PB3 PB10 PB11(TIMER2 CH2 CH3 CH4) as alternate function*/
  21.     GPIO_InitStructure.GPIO_Pin   = GPIO_PIN_3|GPIO_PIN_10|GPIO_PIN_11;
  22.     GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF;
  23.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  24.     GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
  25.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PUPD_NOPULL;
  26.     GPIO_Init(GPIOB,&GPIO_InitStructure);

  27.     GPIO_PinAFConfig(GPIOB,GPIO_PINSOURCE3,GPIO_AF_2);
  28.     GPIO_PinAFConfig(GPIOB,GPIO_PINSOURCE10,GPIO_AF_2);
  29.     GPIO_PinAFConfig(GPIOB,GPIO_PINSOURCE11,GPIO_AF_2);
  30.     /* TIMER2  configuration */
  31.     TIMER_DeInit(TIMER2);
  32.     TIMER_TimeBaseStructure.TIMER_Prescaler     = 71;
  33.     TIMER_TimeBaseStructure.TIMER_CounterMode   = TIMER_COUNTER_UP;
  34.     TIMER_TimeBaseStructure.TIMER_Period        = 15999;
  35.     TIMER_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
  36.     TIMER_BaseInit(TIMER2,&TIMER_TimeBaseStructure);
  37.                
  38.                 TIMER_INTConfig(TIMER2,TIMER_INT_UPDATE,ENABLE);

  39.     /* CH2,CH3 and CH4 Configuration in PWM mode */
  40.     TIMER_OCInitStructure.TIMER_OCMode      = TIMER_OC_MODE_PWM1;
  41.     TIMER_OCInitStructure.TIMER_OCPolarity  = TIMER_OC_POLARITY_HIGH;
  42.     TIMER_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;

  43.     TIMER_OCInitStructure.TIMER_Pulse = 39;
  44.     TIMER_OC2_Init(TIMER2, &TIMER_OCInitStructure);
  45.     TIMER_OC2_Preload(TIMER2,TIMER_OC_PRELOAD_DISABLE);

  46.     TIMER_OCInitStructure.TIMER_Pulse = 79;
  47.     TIMER_OC3_Init(TIMER2, &TIMER_OCInitStructure);
  48.     TIMER_OC3_Preload(TIMER2,TIMER_OC_PRELOAD_DISABLE);

  49.     TIMER_OCInitStructure.TIMER_Pulse = 119;
  50.     TIMER_OC4_Init(TIMER2, &TIMER_OCInitStructure);
  51.     TIMER_OC4_Preload(TIMER2,TIMER_OC_PRELOAD_DISABLE);

  52.     /* Auto-reload preload enable */
  53.     TIMER_CARLPreloadConfig(TIMER2,ENABLE);
  54.     /* TIMER enable counter*/
  55.     TIMER_Enable( TIMER2, ENABLE );
  56.                
  57.                 NVIC_PRIGroup_Enable(NVIC_PRIGROUP_1);
  58.                
  59.                 NVIC_InitStructure.NVIC_IRQ=TIMER2_IRQn;
  60.                 NVIC_InitStructure.NVIC_IRQPreemptPriority=0;
  61.                 NVIC_InitStructure.NVIC_IRQSubPriority=1;
  62.                 NVIC_InitStructure.NVIC_IRQEnable=ENABLE;
  63.                
  64.                 NVIC_Init(&NVIC_InitStructure);
  65.                
  66.                
  67. }
复制代码
实验中使用两个用户按键对占空比进行调节,为了让先是效果比较显著,调节的步长比较大。
  1. void  EXIT_Init(void)
  2. {

  3.   GPIO_InitPara GPIO_InitStructure;
  4.         EXTI_InitPara EXTI_InitStructure;
  5.         NVIC_InitPara NVIC_InitStructure;
  6.         
  7.         RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB,ENABLE);
  8.         
  9.         
  10.         GPIO_InitStructure.GPIO_Pin=GPIO_PIN_6;
  11.         GPIO_InitStructure.GPIO_Mode=GPIO_MODE_IN;
  12.         GPIO_InitStructure.GPIO_PuPd=GPIO_PUPD_NOPULL;
  13.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  14.         
  15.         GPIO_InitStructure.GPIO_Pin=GPIO_PIN_6;
  16.         GPIO_InitStructure.GPIO_Mode=GPIO_MODE_IN;
  17.         GPIO_InitStructure.GPIO_PuPd=GPIO_PUPD_NOPULL;
  18.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  19.         
  20.         GPIO_InitStructure.GPIO_Pin=GPIO_PIN_7;
  21.         GPIO_InitStructure.GPIO_Mode=GPIO_MODE_IN;
  22.         GPIO_InitStructure.GPIO_PuPd=GPIO_PUPD_NOPULL;
  23.         GPIO_Init(GPIOB,&GPIO_InitStructure);        

  24.   RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_CFG,ENABLE);
  25.         
  26.         SYSCFG_EXTILine_Config(EXTI_SOURCE_GPIOB,EXTI_SOURCE_PIN6);
  27.         SYSCFG_EXTILine_Config(EXTI_SOURCE_GPIOB,EXTI_SOURCE_PIN7);
  28.         
  29.         EXTI_InitStructure.EXTI_LINE=EXTI_LINE6;
  30.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  31.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
  32.         EXTI_InitStructure.EXTI_LINEEnable=ENABLE;
  33.         EXTI_Init(&EXTI_InitStructure);
  34.         EXTI_ClearIntBitState(EXTI_LINE6);
  35.         
  36.         EXTI_InitStructure.EXTI_LINE=EXTI_LINE7;
  37.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  38.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
  39.         EXTI_InitStructure.EXTI_LINEEnable=ENABLE;
  40.         EXTI_Init(&EXTI_InitStructure);
  41.         EXTI_ClearIntBitState(EXTI_LINE7);
  42.         
  43.         NVIC_PRIGroup_Enable(NVIC_PRIGROUP_1);
  44.         
  45.         
  46.         NVIC_InitStructure.NVIC_IRQ=EXTI4_15_IRQn;
  47.         NVIC_InitStructure.NVIC_IRQPreemptPriority=0;
  48.         NVIC_InitStructure.NVIC_IRQSubPriority=0;
  49.         NVIC_InitStructure.NVIC_IRQEnable=ENABLE;
  50.         NVIC_Init(&NVIC_InitStructure);
  51.         

  52. }

  53. int KEY_SCAN(void)
  54. {
  55.         int count=0xfff;
  56.         
  57.         if(EXTI_GetIntBitState(EXTI_LINE6)!=RESET)
  58.         {
  59.         while(count--)
  60.                 ;
  61.          if(EXTI_GetIntBitState(EXTI_LINE6)!=RESET)
  62.          {
  63.           EXTI_ClearIntBitState(EXTI_LINE6);
  64.                 return 1;
  65.          }
  66.   }
  67.          
  68.          
  69.          if(EXTI_GetIntBitState(EXTI_LINE7)!=RESET)
  70.         {
  71.         while(count--)
  72.                 ;
  73.          if(EXTI_GetIntBitState(EXTI_LINE7)!=RESET)
  74.          {
  75.           EXTI_ClearIntBitState(EXTI_LINE7);
  76.                 return 2;
  77.          }
  78.         }
  79.                 return 0;
  80. }


  81. void EXTI4_15_IRQHandler(void)
  82. {
  83.         unsigned int temp=15999;
  84.   int key;
  85.         key=KEY_SCAN();
  86.         if(key==1)
  87.         {
  88.           t+=500;
  89.                 if(t>=16000)
  90.                         t=15999;
  91.                 TIMER_Compare3Config( TIMER2, t);
  92.         }
  93.         if(key==2)
  94.         {
  95.    t-=500;
  96.                 if(t<=500)
  97.                         t=500;
  98.                 TIMER_Compare3Config( TIMER2, t);
  99.         }
  100. }
复制代码

PWM.zip

252.49 KB, 下载次数: 60

分享到:
回复

使用道具 举报

回答|共 9 个

倒序浏览

沙发

糖悦之果飞

发表于 2016-6-7 11:25:36 | 只看该作者

真不错,赞一个!
板凳

lcr12

发表于 2016-6-13 23:16:32 | 只看该作者

不错,赞一个,
地板

trochili

发表于 2016-6-17 12:49:28 | 只看该作者

这个是驱动步进电机的?
eeboard大力支持的开源RTOS -- Trochili RTOS
5#

9robot

发表于 2016-6-17 18:07:26 | 只看该作者

trochili 发表于 2016-6-17 12:49
这个是驱动步进电机的?

实验室有几套步进电机和控制器,就想试试,只不过,那套控制器,控制起来比较简单,频率控制速度,高低电平控制方向,并不用调占空比,给方波信号就行。
6#

糖悦之果飞

发表于 2016-6-29 09:11:22 | 只看该作者

文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/
7#

植物大战奥特曼

发表于 2016-6-29 09:13:54 | 只看该作者

刚刚接触,刚好来学习学习
8#

enenge

发表于 2016-8-7 23:07:00 | 只看该作者

精华帖,顶                        
9#

jwdxu2009

发表于 2016-11-21 23:13:39 | 只看该作者

下载下来,参考和学习。
10#

jackten

发表于 2016-12-3 14:31:01 | 只看该作者

谢谢分享                     
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条