1254|1

1191

帖子

31

资源

纯净的硅(初级)

【GD32L233C-START评测】四、定时器PWM应用之驱动RGB灯 [复制链接]

定时器PWM是MCU最常用的外设之一,GD32L233C具有多个定时器和PWM输出通道,定时器资源如下所示:

 

屏幕截图 2022-03-12 114535.png

通过管脚复用可以知道哪些IO具有PWM功能:

1.png

2.png

3.png

4.png

5.png

6.png

 

GD32L233C-START开发板说是兼容arduino uno接口(arduino uno接口的好处不就是有大量arduino生态的扩展板能够即插即用嘛),但是并没有完全支持,只能说这个开发板设计的很水,GD32L233C能输出PWM的IO远多于6个,可是在开发板上并没有按照arduino uno接口的标准将具有PWM功能的IO连接到D3、D5、D6、D9、D10、D11。。。只支持了D3、D9、D11。。。这意味着当arduino扩展板需要3路以上PWM控制信号时,无法即插即用。

屏幕截图 2022-03-12 114434.png 此外,串口有好几个,没有必要将开发板上的USB调试串口和arduino uno接口的D0、D1复用。

标准arduino uno r3接口:

arduino正面.PNG

为了测试PWM功能,使用涂鸦的兼容arduino uno r3的RGB扩展板:

RGB扩展板插在GD32L233C-START上的效果

IMG_20220312_115052.jpg 根据GD32L233C-START开发板的原理图,能够使用PWM的只有PB15、PB0、PB5,遗憾:

IMG_20220312_115014.jpg

涂鸦三明治(PWM)照明功能板是一款支持彩灯五路调光的 LED 控制器。照明功能板(PWM)可实现五路照明功能,带有暖光,冷白及 RGB 灯珠和相应的控制芯片。

  • 冷白,暖白控制采用 SLM211A DC-DC 降压型 PWM 线性恒流调光控制芯片。
  • RGB 控制采用 BP168CJ DC-DC 降压型 PWM 线性恒流控制芯片。
I/O 说明
PWMC 冷白 PWM 控制信号,高电平有效
PWMW 暖白 PWM 控制信号,高电平有效
PWMR RGB 红光控制信号,高电平有效
PWMG RGB 绿光控制信号,高电平有效
PWMB RGB 蓝光控制信号,高电平有效

 

3个控制管脚对应的定时器和PWM通道如下:

PB15 --- timer11-ch1 pwmR
PB5  ---  timer2-ch1  pwmB
PB0  ---  timer2-ch2  pwmW

 

gd32的API设计相比stm32用起来要舒服的多,很简洁,易于使用:

main.c测试代码

#include "gd32l23x.h"
#include "systick.h"

// PB15 --- timer11-ch1 pwmR
// PB5  --- timer2-ch1  pwmB
// PB0  --- timer2-ch2  pwmW

void gpio_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOB);
    /* TIMER2 & TIMER11 GPIO */
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_0 | GPIO_PIN_5 | GPIO_PIN_15);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_5 | GPIO_PIN_15);
    gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_0);
    gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_5);
	  gpio_af_set(GPIOB, GPIO_AF_2, GPIO_PIN_15);
}

void timer2_config(void)
{
    timer_oc_parameter_struct timer_ocinitpara;
    timer_parameter_struct timer_initpara;

    /* enable the peripherals clock */
    rcu_periph_clock_enable(RCU_TIMER2);

    /* deinit a TIMER */
    timer_deinit(TIMER2);
    /* initialize TIMER init parameter struct */
    timer_struct_para_init(&timer_initpara);
    /* TIMER2 configuration */
    timer_initpara.prescaler        = 63;
    timer_initpara.alignedmode      = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection = TIMER_COUNTER_UP;
    timer_initpara.period           = 9999;
    timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;
    timer_init(TIMER2, &timer_initpara);

    /* initialize TIMER channel output parameter struct */
    timer_channel_output_struct_para_init(&timer_ocinitpara);
    /* configure TIMER channel output function */
    timer_ocinitpara.outputstate    = TIMER_CCX_ENABLE;
    timer_ocinitpara.ocpolarity     = TIMER_OC_POLARITY_HIGH;
    timer_channel_output_config(TIMER2, TIMER_CH_1, &timer_ocinitpara);
    timer_channel_output_config(TIMER2, TIMER_CH_2, &timer_ocinitpara);

    timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, 0);
    timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, 0);

    /* CH0 configuration in OC timing mode */
    timer_channel_output_mode_config(TIMER2, TIMER_CH_1, TIMER_OC_MODE_PWM0);
    timer_channel_output_mode_config(TIMER2, TIMER_CH_2, TIMER_OC_MODE_PWM0);
}


void timer11_config(void)
{
    timer_oc_parameter_struct timer_ocinitpara;
    timer_parameter_struct timer_initpara;

    /* enable the peripherals clock */
    rcu_periph_clock_enable(RCU_TIMER11);

    /* deinit a TIMER */
    timer_deinit(TIMER11);
    /* initialize TIMER init parameter struct */
    timer_struct_para_init(&timer_initpara);
    /* TIMER2 configuration */
    timer_initpara.prescaler        = 63;
    timer_initpara.alignedmode      = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection = TIMER_COUNTER_UP;
    timer_initpara.period           = 9999;
    timer_initpara.clockdivision    = TIMER_CKDIV_DIV2;
    timer_init(TIMER11, &timer_initpara);

    /* initialize TIMER channel output parameter struct */
    timer_channel_output_struct_para_init(&timer_ocinitpara);
    /* configure TIMER channel output function */
    timer_ocinitpara.outputstate    = TIMER_CCX_ENABLE;
    timer_ocinitpara.ocpolarity     = TIMER_OC_POLARITY_HIGH;
    timer_channel_output_config(TIMER11, TIMER_CH_1, &timer_ocinitpara);

    timer_channel_output_pulse_value_config(TIMER11, TIMER_CH_1, 0);

    /* CH0 configuration in OC timing mode */
    timer_channel_output_mode_config(TIMER11, TIMER_CH_1, TIMER_OC_MODE_PWM0);
}

int main(void)
{
	systick_config();
  gpio_config();
  timer2_config();
	timer11_config();
	
	while(1)
	{
        /* enable a TIMER */
		timer_enable(TIMER11);
		//pwmR test
		for(int i =0;i<1000;i++)
		{
			delay_1ms(2);
			timer_channel_output_pulse_value_config(TIMER11, TIMER_CH_1, i*10);
		}
		for(int i =999;i>0;i--)
		{
			delay_1ms(2);
			timer_channel_output_pulse_value_config(TIMER11, TIMER_CH_1, i*10);
		}
		timer_channel_output_pulse_value_config(TIMER11, TIMER_CH_1, 0);
		timer_disable(TIMER11);
		//pwmR end
		
		timer_enable(TIMER2);
		//pwmB test
		for(int i =0;i<1000;i++)
		{
			delay_1ms(2);
			timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, i*10);
		}
		for(int i =999;i>0;i--)
		{
			delay_1ms(2);
			timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, i*10);
		}
		timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, 0);
		//pwmB end
		
		//pwmW test
		for(int i =0;i<1000;i++)
		{
			delay_1ms(2);
			timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, i*10);
		}
		for(int i =999;i>0;i--)
		{
			delay_1ms(2);
			timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, i*10);
		}	
		timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, 0);
		timer_disable(TIMER2);
		//pwmW end
	}
}

驱动效果:

IMG_20220312_113735.jpg

IMG_20220312_113741.jpg

IMG_20220312_113743.jpg

 


 

 

此帖出自GD32 MCU论坛

回复

7106

帖子

0

资源

五彩晶圆(中级)

GD32L233C能输出PWM的IO远多于6个,PWM的IO口不少


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

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    推荐帖子
    电快速瞬变脉冲群(EFT)不过的原因分析和整改经验分享

    1.不合格原因 对于检验设备的抗扰度来说,电快速脉冲试验具有典型意义,由于电快速脉冲试验波形的上升沿很陡,因此包含了很丰富 ...

    TI积分兑换E金币,未到账

    请问是否有工作人员在跟进处理呢?已经兑换很久了,至今未到账。 TI签到积分兑换礼品是否还有效?请工作人员告知,否则大 ...

    还以为IAR出了问题,原来可以在多个位置同时输入。

    IAR里按住CTRL键用鼠标选择多位置,居然可以在多个选择的位置同时输入内容,以前无意间遇到这个问题还以为IAR出了问题。 4686 ...

    课后回顾丨ADI电源大咖培训课精华集锦

    温故而知新,欢迎大家观看>>《ADI电源大咖培训课》初级篇【课程回放】 精华内容: ● 电源系统构成及基础原理、概 ...

    红外接收器的 传输距离典型值 是什么意思 ?

    见附图,为Vishay红外接收管 选型参数表。 附件为 TSOP93130接收管规格书。 请教: 1. 参数 Transmission Distance ...

    RSL10-002GEVB蓝牙功能测试

    本帖最后由 dql2016 于 2021-4-25 18:59 编辑 现在对蓝牙的知识还不算丰富,只能先把官方提供的例程拿来跑一跑看看效果,我测 ...

    关闭
    站长推荐上一条 1/7 下一条

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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