【试用】+GD32F207ZE的PWM测试应用

[复制链接]
1731|2
 楼主| coslight 发表于 2016-4-6 21:20 | 显示全部楼层 |阅读模式
本帖最后由 coslight 于 2016-4-6 21:24 编辑

看了一下应用手册和开发板原理图发现可以利用开发板上的LED中的2个做呼吸灯效果。通过开发板硬件手册可以看到,LD5和LD6两个LED占用PD12和PD13引脚。通过GD32用户手册我们可以看到,TIME4的通道1和通道2通过引脚映射正好也占用了PD12和PD13,因此产生了利用TIME4的通道1和通道2产生PWM可调占空比输出驱动LED灯,产生呼吸灯效果。

无标题.jpg
无标题.jpg

程序已GD32的例程为基础,添加TIME4的初始化,PWM输出初始化,输出占空比动态调整函数接口。

  1. /*************************************************************************************************
  2. *  ¹¦ÄÜ£º³õʼ»¯Óû§LedÉ豸                                                                      *
  3. *  ²ÎÊý£ºÎÞ                                                                                     *
  4. *  ·µ»Ø£ºÎÞ                                                                                     *
  5. *  ËµÃ÷£º                                                                                       *
  6. *************************************************************************************************/
  7. void EvbLed1Config(void)
  8. {
  9.     GPIO_InitPara GPIO_InitStructure;
  10.     /* -----------------------------------------------------------------------
  11.     TIMER2 Configuration: generate 3 PWM signals with 3 different duty cycles:
  12.     TIMER2CLK = SystemCoreClock / 120 = 1MHz
  13.     TIMER2 frequency = 10000/1M = 10ms
  14.     TIMER2 Channel2 duty cycle = (2500/ 10000)* 100 = 25%
  15.     TIMER2 Channel3 duty cycle = (5000/ 10000)* 100 = 50%
  16.     TIMER2 Channel4 duty cycle = (7500/ 10000)* 100 = 75%
  17.     ----------------------------------------------------------------------- */
  18.     TIMER_BaseInitPara TIMER_TimeBaseStructure;
  19.     TIMER_OCInitPara   TIMER_OCInitStructure;

  20.                 RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);
  21.                 GPIO_PinRemapConfig(GPIO_REMAP_TIMER4, ENABLE);        

  22.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12|GPIO_PIN_13;
  23.     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  25.     GPIO_Init(GPIOD,&GPIO_InitStructure);

  26.                 /* TIMER2 clock enable */
  27.     RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER4,ENABLE);

  28.     /* TIMER2  configuration */
  29.     TIMER_DeInit(TIMER4);
  30.     TIMER_TimeBaseStructure.TIMER_Prescaler     = 119;
  31.     TIMER_TimeBaseStructure.TIMER_CounterMode   = TIMER_COUNTER_UP;
  32.     TIMER_TimeBaseStructure.TIMER_Period        = 9999;
  33.     TIMER_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
  34.     TIMER_BaseInit(TIMER4,&TIMER_TimeBaseStructure);

  35.     /* CH2,CH3 and CH4 Configuration in PWM mode */
  36.     TIMER_OCInitStructure.TIMER_OCMode      = TIMER_OC_MODE_PWM1;
  37.     TIMER_OCInitStructure.TIMER_OCPolarity  = TIMER_OC_POLARITY_HIGH;
  38.     TIMER_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;
  39.     TIMER_OCInitStructure.TIMER_OCIdleState = TIMER_OC_IDLE_STATE_RESET;

  40.     TIMER_OCInitStructure.TIMER_Pulse = 0;
  41.     TIMER_OC1_Init(TIMER4, &TIMER_OCInitStructure);
  42.     TIMER_OC1_Preload(TIMER4,TIMER_OC_PRELOAD_DISABLE);

  43.     TIMER_OCInitStructure.TIMER_Pulse = 9999;
  44.     TIMER_OC2_Init(TIMER4, &TIMER_OCInitStructure);
  45.     TIMER_OC2_Preload(TIMER4,TIMER_OC_PRELOAD_DISABLE);

  46.     /* Auto-reload preload enable */
  47.     TIMER_CARLPreloadConfig(TIMER4,ENABLE);
  48.     /* TIMER enable counter*/
  49.     TIMER_Enable( TIMER4, ENABLE );

  50. }


  51. /*************************************************************************************************
  52. *  ¹¦ÄÜ£º¿ØÖÆLedµÄµãÁÁºÍϨÃð                                                                    *
  53. *  ²ÎÊý£º(1) index LedµÆ±àºÅ                                                                    *
  54. *        (2) cmd   LedµÆµãÁÁ»òÕßϨÃðµÄÃüÁî                                                      *
  55. *  ·µ»Ø£ºÎÞ                                                                                     *
  56. *  ËµÃ÷£º                                                                                       *
  57. *************************************************************************************************/
  58. void EvbLed1Control(int index, int cmd)
  59. {
  60.     TIMER_OCInitPara   TIMER_OCInitStructure;
  61.     TIMER_OCInitStructure.TIMER_OCMode      = TIMER_OC_MODE_PWM1;
  62.     TIMER_OCInitStructure.TIMER_OCPolarity  = TIMER_OC_POLARITY_HIGH;
  63.     TIMER_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;
  64.     TIMER_OCInitStructure.TIMER_OCIdleState = TIMER_OC_IDLE_STATE_RESET;

  65.     TIMER_OCInitStructure.TIMER_Pulse = cmd%10000;

  66.                 if(index==1)
  67.                 {
  68.                         TIMER_OC1_Init(TIMER4, &TIMER_OCInitStructure);
  69.                         TIMER_OC1_Preload(TIMER4,TIMER_OC_PRELOAD_DISABLE);
  70.                 }
  71.                 else
  72.                 {
  73.                         TIMER_OC2_Init(TIMER4, &TIMER_OCInitStructure);
  74.                         TIMER_OC2_Preload(TIMER4,TIMER_OC_PRELOAD_DISABLE);
  75.                 }
  76. }

主程序测试代码
  1. #include "example.h"

  2. #if (EVB_EXAMPLE == LED1_EXAMPLE)

  3. /* Óû§Ó¦ÓóÌÐòÈë¿Úº¯Êý */
  4. static int count;
  5. static char flag=0;
  6. int main(void)
  7. {
  8.     int i;
  9.    
  10.     /* ÅäÖÃʹÄÜÆÀ¹À°åÉϵÄÉ豸 */
  11.     EvbSetupBoard();
  12.                 count = 0;
  13.     PRINTF("¸ÐлʹÓÃColibri¿ª·¢°å\r\n");
  14.     PRINTF("\r\n");
  15.     PRINTF("##### LED ʵÑé #####\r\n");
  16.     PRINTF("\r\n");

  17.     while(1)
  18.     {
  19.         for (i = 0; i< 0x2ffff; i++);
  20.                                 EvbLed1Control(1,count);
  21.                                 EvbLed1Control(0,9999-count);
  22.                                 if(flag ==0)
  23.                                 {
  24.                                         count+=100;
  25.                                         if(count >= 9999)
  26.                                         {
  27.                                                 flag = 1;
  28.                                                 count = 9999;
  29.                                         }
  30.                                 }
  31.                                 else
  32.                                 {
  33.                                         count-=100;
  34.                                         if(count <= 0)
  35.                                         {
  36.                                                 flag = 0;
  37.                                                 count = 0;
  38.                                         }
  39.                                 }
  40.     }
  41. }
  42. #endif


源代码就不上传整个工程了,把修改的部分上传上来。
time4-pwm-led.rar (1.4 KB, 下载次数: 18)

最后附上视频显示执行效果
http://v.youku.com/v_show/id_XMTUyNTczMjg4OA==.html

mainch 发表于 2016-5-27 16:50 | 显示全部楼层
请问用户手册在哪里下载?
 楼主| coslight 发表于 2016-5-27 23:17 | 显示全部楼层
可以在论坛里找找
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

928

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部