GD32F303开发 ----- 定时器产生PWM实现呼吸灯

概述:

        本章就以GD32F303Rx开发板为例,主要配置定时器输出PWM信号,并调节占空比从而实现呼吸灯的效果,占空比逐渐变大,则灯就越亮

一、原理图连接

 查看原理图,获得信息LED0的管脚为PA8。

 二、PWM通道

 

 查看GD32F303数据手册找到GD32F303Rx引脚定义,然后找到LED引脚信息,可以看出PA8对应的是TIME0的CH0通道。

三、核心代码

 1、初始化GPIO

/* GPIO配置函数 */
void gpio_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_AF);

    /* 配置 PA8 引脚为复用推挽输出模式 */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
}

2、初始化定时器

// 定时器配置函数
void timer_config(void)
{
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER0);

    timer_deinit(TIMER0);

    /* 定时器配置 */
    timer_initpara.prescaler         = 119;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 15999;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER0, &timer_initpara);

    /* PWM模式下配置 CH0、CH1 和 CH2 */
    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;

    // 配置 TIMER0 通道输出功能
    timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);

    /* CH0 以 PWM 模式工作,占空比为 0% */
    timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 0);
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);

	/* 配置 TIMER 主输出功能 */
	timer_primary_output_config(TIMER0, ENABLE);

    /* 自动重装载预装载使能 */
    timer_auto_reload_shadow_enable(TIMER0);
    /* 定时器使能 */
    timer_enable(TIMER0);
}

3、调节占空比递增、递减

void PWM_OUT(void)
{
    int16_t duty_cycle = 0;
    FlagStatus breathe_flag = SET;

    while (1) {
        /* 延迟一段时间,单位为毫秒 */
        delay_1ms(40);

        if (SET == breathe_flag) {
            duty_cycle = duty_cycle + 500;
        } else {
            duty_cycle = duty_cycle - 500;
        }

        if (16000 < duty_cycle) {
            breathe_flag = RESET;
        }
        if (0 >= duty_cycle) {
            breathe_flag = SET;
        }

        /* 配置 TIMER0 通道输出脉冲值 */
        timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, duty_cycle);
    }
}

4、 main函数

int main(void)
{
    systick_config();  							// 配置 SysTick 定时器 
	gpio_config();                              
    timer_config();	                            
	
	PWM_OUT ();
}

 以上就是GD32F303开发板配置定时器输出PWM信号,并实现呼吸灯的方法和步骤,欢迎留言讨论。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
电压源设计思路介绍: 1、改高精度电压源基于GD32F190设计完成。利用GD190内部的高精度OPAMP,对经过整流后的直流电压进行电压采样,对比取样后的电压,通过GD190内部的DAC控制场效应管的导通,从而控制输出电压的大小。 2、 另一方面,通过GD190内部12位的ADC对采样电压采样,然后将采样的结果显示到LCD5110,而且可以通过小红板上面的按键调节输出电压的大小。 GD32开发板资料汇总详见链接: 高精度电压源硬件设计框图:https://www.cirmall.com/circuit/3721/ 高电压源视频展示: 设计心得总结: 1、本案例的核心在于软件PWM的生成,100路8分辨率PWM输出对于普通单片机来说还是有一定的压力,还要同时处理DMX512数据的接收,得益于GD32F207的120M运行速度,可以在短时间内处理更多的指令,将100路PWM计数变量分成10组,通过轮流的方式更新每一组IO的计数变量,同时更新IO的状态,有效的减少中断处理的数据量,缩短处理时间,本案例中实现了8位分辨率400HZ以上的PWM输出,用来控制调光,完全不会出现闪烁的情况。串口中断方式接收DMX512数据帧,即时保存在DMX512的缓冲区中,按DMX512数据每秒40帧的更新速度,最多在第2帧数据到来时可以把当前状态更新到所控制的上。 2、本案例控制IO输出采用了数据表映射的方式,可以任意修改IO所对应DMX512数据字节,操作时读取数据表里的映射数据,直接操作GPIO控制寄存器,也有效的减少操作指令,提高了操作效率。 3、采用高频率的单片机模拟多路PWM的方式,取代市场上现有的使用FPGA的方案,在满足性能的同时有效的降低了产品的设计复杂程度和产品成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值