7150|2

821

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

[GD32E231 DIY大赛](三):TIMER2_CH1 PWM输出 [复制链接]

本帖最后由 lising 于 2019-5-14 18:20 编辑

      本次实验的主要目的是为后期的实战做前期准备,利用GD32E231C_START评估板上的用户按键“KEY”控制定时器"TIMER2_CH1"的PWM输出,用以改变LED1的亮度。


一、实验资源
1、GD32E231C_START评估板;
2、Keil v5.27.1.0;
3、GigaDevice.GD32E23x_DFP.1.0.0.pack;

4、GD32E23x_Demo_Suites_V1.0.1;
5、GD32E231C_START开发板相关文档;

6、逻辑分析仪。

二、实验过程
1、资源配置。GD32E231C8T6具有非常丰富的定时器资源,这其中包括1个高级定时器TIMER0;5个通用定时器TIMER(2,13~16);1个基本定时器TIMER5,当然还包括RTC等等。结合数据手册及评估板原理图可以看到四个LED分别受控于PA7、PA8、PA11、PA12引脚,其中的PA7引脚的复用功能包含了通用定时器TIMER2的“TIMER2_CH1”,同时PB5引脚同样也可复用为“TIMER2_CH1”,正好PB5已被“JP9”引出方便外部测试,于是本次实验的定时器资源使用了通用定时器TIMER2。还有就是利用了接在PA0上按键“KEY”,高电平有效,用以调整PWM输出信号的占空比。



2、程序实现。参考了官方提供的例程,首先PA7引脚进行相应配置,要注意的是打开PA7引脚“TIMER2_CH1”的复用功能“AF1”;然后对TIMER2_CH1通道PWM输出进行相应配置并使能PWM输出。
下面是主函数:
  1. int main(void)
  2. {
  3.         systick_config();
  4.         
  5.         KEY_PORT_Init();
  6.         PWM_Config();
  7.         while(1)
  8.         {
  9.                 KEY_Scan();//用于调整PWM输出占空比
  10.         }
  11. }
复制代码



TIMER2_CH1”通道PWM输出配置函数:
  1. void PWM_Config(void)
  2. {
  3.         timer_oc_parameter_struct timer_ocintpara;
  4.         timer_parameter_struct timer_initpara;
  5.         rcu_periph_clock_enable(PWM_OUT_PORT_CLK);
  6.         rcu_periph_clock_enable(RCU_TIMER2);

  7.         gpio_mode_set(PWM_OUT_PORT,
  8.                                                                 GPIO_MODE_AF,
  9.                                                                 GPIO_PUPD_NONE ,
  10.                                                                 PWM_OUT_PIN);

  11.         gpio_output_options_set(PWM_OUT_PORT,
  12.                                                                                                         GPIO_OTYPE_PP,
  13.                                                                                                         GPIO_OSPEED_50MHZ,
  14.                                                                                                         PWM_OUT_PIN);//PA7(TIMER2_CH1)

  15.         gpio_af_set(PWM_OUT_PORT,
  16.                                                         GPIO_AF_1,
  17.                                                         PWM_OUT_PIN);//配置PA7引脚复用功能为TIEMR2_CH1
  18.         
  19.         timer_deinit(TIMER2);

  20.         /* TIMER2 configuration */
  21.         timer_initpara.prescaler         = 719;//预分频器值72M/(719+1)=100KHz
  22.         timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;//对齐模式
  23.         timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  24.         timer_initpara.period            = 999;//周期值,此值确定了PWM输出的周期
  25.         timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;//时钟分频值
  26.         timer_initpara.repetitioncounter = 0;//计数器重复值
  27.         timer_init(TIMER2,&timer_initpara);

  28.          /* CH0 configuration in PWM mode */
  29.         timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
  30.         timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
  31.         timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
  32.         timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
  33.         timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
  34.         timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
  35.         timer_channel_output_config(TIMER2,TIMER_CH_1,&timer_ocintpara);

  36.         timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,0);
  37.         timer_channel_output_mode_config(TIMER2,TIMER_CH_1,TIMER_OC_MODE_PWM0);
  38.         timer_channel_output_shadow_config(TIMER2,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);

  39.         timer_primary_output_config(TIMER2,ENABLE);
  40.         timer_auto_reload_shadow_enable(TIMER2);
  41.         timer_enable(TIMER2);
  42. }
复制代码



按键函数:
  1. void KEY_Scan(void)
  2. {
  3.         static uint8_t num=0;
  4.         
  5.         if(KEY==1)
  6.         {
  7.                 delay_1ms(20);
  8.                 if(KEY==1)
  9.                 {
  10.                         num++;
  11.                         if(num==5)
  12.                                 num=1;
  13.                 }
  14.                
  15.                 switch (num)
  16.                 {
  17.                         case 1:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,900);break;        //占空比90%
  18.                         case 2:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,650);break;        //占空比65%
  19.                         case 3:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,300);break;        //占空比30%
  20.                         case 4:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,0);break;                //占空比0
  21.                         default:break;
  22.                 }
  23.                 while(KEY==1);
  24.         }
  25. }
复制代码



3、实验结果


4、测试占空比
      为方便测试,将“TIMER2_CH1”通道PWM输出功能转移至PB5引脚,直接在预定义中修改:
  1. #define PWM_OUT_PORT                         GPIOB
  2. #define PWM_OUT_PIN                         GPIO_PIN_5
  3. #define PWM_OUT_PORT_CLK         RCU_GPIOB
复制代码

然后接上逻辑分析仪进行测试,通过按键“KEY”可对输出信号的占空比进行相应的调整,测试如下:

三、总结
      按键应该考虑使用中断,下一步进行改进。

此帖出自GD32 MCU论坛

最新回复

谢谢分享!  详情 回复 发表于 2019-5-15 13:13
点赞 关注(1)
 

回复
举报

172

帖子

0

TA的资源

宇宙尘埃

沙发
 
谢谢分享!
此帖出自GD32 MCU论坛

点评

共同学习,欢迎探讨。  详情 回复 发表于 2019-5-15 14:55
 
 
 

回复

821

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

共同学习,欢迎探讨。
此帖出自GD32 MCU论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表