搜索
bottom↓
回复: 2
打印 上一主题 下一主题

用gd32f330驱动单极性归零码LED出现波形不对的问题

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2022-5-12 20:06:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tjiefk 于 2022-5-12 20:08 编辑

最近有一个项目需要用到RGB LED,选了内置IC的LED灯珠,MCU用GD32F330,PWM+DMA方式,用示波器发现波形不太对,高占空比切到低占空比没有问题,但从低占空比切到高占空比时就出现第一个高占空比波形不对


下面是代码:

#include "rgb_led.h"

const uint8_t g_red[3] = {0x00, 0xff, 0x00};
const uint8_t g_green[3] = {0xff, 0x00, 0x00};
const uint8_t g_blue[3] = {0x00, 0x00, 0xff};

uint16_t g_rgb_led_buf[(24*7+24)]=
{
    // ZERO,ZERO,ZERO,ZERO,ONE,ONE,ONE,ONE,
    // ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,
    // ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,
        ZERO
};

// uint8_t g_rgb_led_buf[48]=
// {
//     ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,
//     ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,
//     ZERO,ZERO,ZERO,ZERO,ONE,ONE,ONE,ONE,
//     0,0,0,0,0,0,0,0,
//     0,0,0,0,0,0,0,0,
//     0,0,0,0,0,0,0,0
// };

void rgb_led_gpio_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOB);
    /*Configure PB5(TIMER2_CH1) as alternate function*/
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_4);
    gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_4);

}

void timer2_init(void)
{
    /* TIMER2 configuration: generate PWM signals with different duty cycles:
    TIMER2CLK = SystemCoreClock / 1 = 84MHz */
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER2);
    timer_deinit(TIMER2);

    /* TIMER0 configuration */
    timer_initpara.prescaler         = 1-1;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 94-1;            //PWM频率893K
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_init(TIMER2,&timer_initpara);

     /* CH0 configuration in PWM mode */
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    timer_channel_output_config(TIMER2,TIMER_CH_0,&timer_ocintpara);

    timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,0);      //占空比66%
    timer_channel_output_mode_config(TIMER2,TIMER_CH_0,TIMER_OC_MODE_PWM0);
    timer_channel_output_shadow_config(TIMER2,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);

    /* auto-reload preload enable */
    //timer_auto_reload_shadow_enable(TIMER2);

    timer_dma_disable(TIMER2, TIMER_DMA_CH0D);
   
}

void rgb_dma_init(void)
{
    dma_parameter_struct dma_init_struct;

    /* enable DMA clock */
    rcu_periph_clock_enable(RCU_DMA);
   
    /* initialize DMA channel */
    dma_deinit(DMA_CH3);
    /* DMA channel3 initialize */
    dma_struct_para_init(&dma_init_struct);
    dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
    dma_init_struct.memory_addr = (uint32_t)g_rgb_led_buf;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;   
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
    dma_init_struct.number = 0;
    dma_init_struct.periph_addr = (uint32_t)TIMER2_CH0CV_ADDR;
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
    dma_init(DMA_CH3,&dma_init_struct);
    /* 使能循环模式 */
    //dma_circulation_enable(DMA_CH3);
    /* enable DMA channel3 */
        
}



void rgb_led_init(void)
{
    rgb_led_gpio_init();
    rgb_dma_init();
    timer2_init();
}




void rgb_led_show(const uint8_t color[], uint16_t len)
{
    uint8_t i = 0;
    uint16_t memaddr = 0;
    uint16_t buffersize = 0;

    buffersize = (len * 24)+24;       // number of bytes needed is #LEDs * 24 bytes + 42 trailing bytes
//    memaddr = 0;                        // reset buffer memory index

    while (len)
    {
        /*  green data */
        for(i = 0; i < 8; i++)
        {
            g_rgb_led_buf[memaddr] = ((color[0] << i) & 0x80) ? ONE : ZERO;
            memaddr++;
        }

        /*  red data */
        for(i = 0; i < 8; i++)
        {   
            g_rgb_led_buf[memaddr] = ((color[1] << i) & 0x80) ? ONE : ZERO;
            memaddr++;
        }

        /*  blue data */
        for(i = 0; i < 8; i++)
        {
            g_rgb_led_buf[memaddr] = ((color[2] << i) & 0x80) ? ONE : ZERO;
            memaddr++;
        }

        len--;
    }
    timer_counter_value_config(TIMER2, 0);
    dma_transfer_number_config(DMA_CH3, buffersize);   
    timer_dma_enable(TIMER2, TIMER_DMA_CH0D);
    dma_channel_enable(DMA_CH3);
    timer_enable(TIMER2);
    while(!dma_flag_get(DMA_CH3, DMA_FLAG_FTF));
    timer_disable(TIMER2);
    dma_channel_disable(DMA_CH3);
    dma_flag_clear(DMA_CH3, DMA_FLAG_FTF);
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

2
 楼主| 发表于 2022-5-14 07:38:36 来自手机 | 只看该作者
终于搞定了,但又出现新问题,第一个脉冲丢失,前面加多少0都没用

出0入475汤圆

3
发表于 2022-5-14 07:59:04 来自手机 | 只看该作者
虽然没有去看你的代码。但是可以提醒你一下,因为正好前几天刚用了PiC的pwm,说的是需要的第一次定时器溢出后再开启pwm输出(pic是操作gpio输出模式使能),这样可以避免第一个脉冲宽度不对的问题,因为可能切换或者刚配置后第一个的时间不是满的,希望有用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 14:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表