This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280049C:使用 tms320f280049c 使 WS2812B 新像素 LED 闪烁

Guru**** 2303350 points
Other Parts Discussed in Thread: TMS320F280049C
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1520167/tms320f280049c-blink-the-ws2812b-neo-pixel-leds-using-tms320f280049c

器件型号:TMS320F280049C

工具/软件:

我正在使用 TMS320F280049C 微控制器,我想使用 Ws2812B neo 像素 led 来点亮我所需的颜色,并在我的代码它打开所有 数量提到的 LED 的白色,而不是我所需的颜色。 我会附上代码。 请帮助我尽快解决此问题。 谢谢你。

#include "device.h"
#include "gpio.h"

#define NEOPIXEL_PIN  4
#define NUM_LEDS      2               // Number of LEDs
#define BLINK_DELAY   500000          // 500ms delay

// GRB color values (0-255)
#define RED           0, 255, 0       // Green component for red color
#define GREEN         255, 0, 0       // Red component for green color
#define BLUE          0, 0, 255       // Blue component

// System clock frequency in MHz for cycle calculations
#define SYS_FREQ_MHZ (DEVICE_SYSCLK_FREQ / 1000000)

// Timing parameters (in microseconds)
#define T0H           0.4f            // High time for '0' bit
#define T1H           0.8f            // High time for '1' bit
#define T0L           0.85f           // Low time for '0' bit
#define T1L           0.45f           // Low time for '1' bit

// Convert timing to CPU cycles
#define CYCLES_PER_US SYS_FREQ_MHZ
#define T0H_CYCLES   (uint32_t)(T0H * CYCLES_PER_US)
#define T1H_CYCLES   (uint32_t)(T1H * CYCLES_PER_US)
#define T0L_CYCLES   (uint32_t)(T0L * CYCLES_PER_US)
#define T1L_CYCLES   (uint32_t)(T1L * CYCLES_PER_US)

void delay_cycles(uint32_t cycles) {
    while (cycles--) {
        __asm(" NOP");
    }
}

void send_neopixel_byte(uint8_t byte, uint16_t pin) {
    for (int i = 7; i >= 0; i--) {
        uint8_t bit_val = (byte >> i) & 1;
        
        GPIO_writePin(pin, 1);                // Signal start of bit
        
        if (bit_val) {
            delay_cycles(T1H_CYCLES - 2);     // High pulse for '1'
            GPIO_writePin(pin, 0);
            delay_cycles(T1L_CYCLES - 2);     // Low period for '1'
        } else {
            delay_cycles(T0H_CYCLES - 2);     // High pulse for '0'
            GPIO_writePin(pin, 0);
            delay_cycles(T0L_CYCLES - 2);     // Low period for '0'
        }
    }
}

void set_all_leds(uint8_t green, uint8_t red, uint8_t blue) {
    for (int j = 0; j < NUM_LEDS; j++) {
        send_neopixel_byte(green, NEOPIXEL_PIN);  // GRB order
        send_neopixel_byte(red, NEOPIXEL_PIN);
        send_neopixel_byte(blue, NEOPIXEL_PIN);
    }
    GPIO_writePin(NEOPIXEL_PIN, 0);   // Reset signal
    delay_us(60);                      // Hold low for 60µs
}

void main(void) {
    Device_init();
    Device_initGPIO();
    GPIO_setDirectionMode(NEOPIXEL_PIN, GPIO_DIR_MODE_OUT);

    while (1) {
        set_all_leds(GREEN);           // Green component for red color
        delay_us(BLINK_DELAY);
        set_all_leds(0, 0, 0);         // Turn off LEDs
        delay_us(BLINK_DELAY);
    }
}
 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    请允许我再过一天来查看此查询。 感谢您的耐心!

    此致、

    Allison

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还可以 请给我完整的代码,打开 LED 除白色以外的任何颜色,以便我可以验证,与我的,也是我面临的问题是与我认为的时间问题. 如果您给我完整的代码、它将对我非常有帮助。 感谢您的快速答复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    很遗憾、我无法在 WS2812B 方面提供帮助、因为我的专业知识仅涉及 TMS320F280049C 器件。  您是否已经确定 了 GPIO 的范围并确保输出符合预期? 我对这个特定的设置不熟悉、因此无法为您提供代码解决方案。 不过、我可以提供指导来尝试帮助调试问题。 如果您对 F280049C 器件(配置等)有任何针对性的问题、我将在其中提供进一步的指导。  

    此致、

    Allison

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #include "driverlib.h"
    #include "device.h"
    #include "gpio.h"
    
    #define NEOPIXEL_PIN  4
    #define NUM_LEDS      2
    #define BLINK_DELAY   500000
    
    
    #define RED           0, 255, 0
    #define GREEN         25, 10, 20
    #define BLUE          69, 98, 25
    
    //#define SYS_FREQ_MHZ (DEVICE_SYSCLK_FREQ/10000000)
    
    #define T0H           0.4f
    #define T1H           0.8f
    #define T0L           0.85f
    #define T1L           0.45f
    int i,j;
    
    #define T0H_CYCLES   (uint32_t)((uint64_t)DEVICE_SYSCLK_FREQ * 0.4 / 10000000)
    #define T1H_CYCLES   (uint32_t)((uint64_t)DEVICE_SYSCLK_FREQ * 0.8 / 10000000)
    #define T0L_CYCLES   (uint32_t)((uint64_t)DEVICE_SYSCLK_FREQ * 0.85 / 10000000)
    #define T1L_CYCLES   (uint32_t)((uint64_t)DEVICE_SYSCLK_FREQ * 0.45 / 10000000)
    
    
    
    void send_neopixel_byte(uint8_t byte, uint16_t pin) {
        for ( i = 7; i >= 0; i--) {
            uint8_t bit_val = (byte >> i) & 1;
            if (bit_val) {
                GPIO_writePin(pin, 1);
                DEVICE_DELAY_US(0.8);
                GPIO_writePin(pin, 0);
                DEVICE_DELAY_US(0.45);
            } else {
                GPIO_writePin(pin, 1);
                DEVICE_DELAY_US(0.4);
                GPIO_writePin(pin, 0);
                DEVICE_DELAY_US(0.85);
            }
        }
    }
    
    void set_all_leds(uint8_t green, uint8_t red, uint8_t blue) {
        for ( j = 0; j < NUM_LEDS; j++) {
            send_neopixel_byte(green, NEOPIXEL_PIN);
            send_neopixel_byte(red, NEOPIXEL_PIN);
            send_neopixel_byte(blue, NEOPIXEL_PIN);
    
        }
        GPIO_writePin(NEOPIXEL_PIN, 0);
        DEVICE_DELAY_US(50);
    }
    
    void main(void) {
        Device_init();
        Device_initGPIO();
        GPIO_setDirectionMode(NEOPIXEL_PIN, GPIO_DIR_MODE_OUT);
    
        while (1) {
            set_all_leds(RED);
            DEVICE_DELAY_US(BLINK_DELAY);
            set_all_leds(0, 0, 0);
            DEVICE_DELAY_US(BLINK_DELAY);
        }
    }
    

    没关系。 您能添加一些具备 WS2812B neopixel 领导的专业知识的人、以便我可以与他们核实、我很确定我有时间问题。 如果可能、请检查一下。 我已经添加了我修改的代码,但仍然是相同的问题 ,仅转向的 LED 的白色。  非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

     WS2812B 不是 TI 自有的器件、因此我们不支持针对此特定问题的咨询。 您必须联系该设备组以获得支持。

    通过快速搜索、似乎对支持 LED 的时序要求非常严格。 因此、我建议您使用 NOP 而不是 DEVICE_DELAY_US (x)。 device_delay_US (x)用于实现 device.h 文件中定义的微秒级延迟:

    我还会仔细检查您的 循环 、并确保 "i"被指定为有符号整数 类型 、以满足您的循环条件。

    此致、

    Allison