|
[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输出。
下面是主函数:
- int main(void)
- {
- systick_config();
-
- KEY_PORT_Init();
- PWM_Config();
- while(1)
- {
- KEY_Scan();//用于调整PWM输出占空比
- }
- }
复制代码
“TIMER2_CH1”通道PWM输出配置函数:
- void PWM_Config(void)
- {
- timer_oc_parameter_struct timer_ocintpara;
- timer_parameter_struct timer_initpara;
- rcu_periph_clock_enable(PWM_OUT_PORT_CLK);
- rcu_periph_clock_enable(RCU_TIMER2);
- gpio_mode_set(PWM_OUT_PORT,
- GPIO_MODE_AF,
- GPIO_PUPD_NONE ,
- PWM_OUT_PIN);
- gpio_output_options_set(PWM_OUT_PORT,
- GPIO_OTYPE_PP,
- GPIO_OSPEED_50MHZ,
- PWM_OUT_PIN);//PA7(TIMER2_CH1)
- gpio_af_set(PWM_OUT_PORT,
- GPIO_AF_1,
- PWM_OUT_PIN);//配置PA7引脚复用功能为TIEMR2_CH1
-
- timer_deinit(TIMER2);
- /* TIMER2 configuration */
- timer_initpara.prescaler = 719;//预分频器值72M/(719+1)=100KHz
- timer_initpara.alignedmode = TIMER_COUNTER_EDGE;//对齐模式
- timer_initpara.counterdirection = TIMER_COUNTER_UP;
- timer_initpara.period = 999;//周期值,此值确定了PWM输出的周期
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1;//时钟分频值
- timer_initpara.repetitioncounter = 0;//计数器重复值
- timer_init(TIMER2,&timer_initpara);
- /* CH0 configuration in PWM mode */
- timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
- timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
- timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
- timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
- timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
- timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
- timer_channel_output_config(TIMER2,TIMER_CH_1,&timer_ocintpara);
- timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,0);
- timer_channel_output_mode_config(TIMER2,TIMER_CH_1,TIMER_OC_MODE_PWM0);
- timer_channel_output_shadow_config(TIMER2,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);
- timer_primary_output_config(TIMER2,ENABLE);
- timer_auto_reload_shadow_enable(TIMER2);
- timer_enable(TIMER2);
- }
复制代码
按键函数:
- void KEY_Scan(void)
- {
- static uint8_t num=0;
-
- if(KEY==1)
- {
- delay_1ms(20);
- if(KEY==1)
- {
- num++;
- if(num==5)
- num=1;
- }
-
- switch (num)
- {
- case 1:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,900);break; //占空比90%
- case 2:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,650);break; //占空比65%
- case 3:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,300);break; //占空比30%
- case 4:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,0);break; //占空比0
- default:break;
- }
- while(KEY==1);
- }
- }
复制代码
3、实验结果
4、测试占空比
为方便测试,将“TIMER2_CH1”通道PWM输出功能转移至PB5引脚,直接在预定义中修改:
- #define PWM_OUT_PORT GPIOB
- #define PWM_OUT_PIN GPIO_PIN_5
- #define PWM_OUT_PORT_CLK RCU_GPIOB
复制代码
然后接上逻辑分析仪进行测试,通过按键“KEY”可对输出信号的占空比进行相应的调整,测试如下:
三、总结
按键应该考虑使用中断,下一步进行改进。
|
|