中科蓝讯532X系列PWM的使用

本文介绍了如何在中科蓝讯532X系列芯片上进行PWM的初始化,包括在pwm_port_init函数下的注意事项,以及如何编写和调用扫描函数。在bsp_sys_init中调用初始化函数,并在usr_tmr5ms_isr中断服务例程中通过标志位控制播放或暂停状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实例:
PB3实现呼吸灯

初始化

在pwm_port_init函数下

GPIOBDIR &= ~BIT(3); //DIR OUT
	GPIOBDE |= BIT(3); //数字 IO 口要设置上.
	GPIOBFEN |= BIT(3); //function io enable
	FUNCMCON2 = (2 << 8); // TIMER3的G2   pwm map to G1 (PE1/2/3)timer5->16Bit timer4->12Bit timer3->8Bit
	TMR3CON = 0x00; //时钟源默认为系统时钟 24M
	TMR3CNT = 0;
	TMR3PR = 1000; //例如为 24M 时, 频率为 24M/(12000*4) = 500HZ, 即周期为0.002S. //U32
//	TMR3DUTY0 = 12000 - 1; //u16 //25% 负占空比 PE1 //注意 PR >= DUTY //DUTY ==PR, 全高. -1 (也就是 0xFFFF)时, 全低, 其他值表示"负占空比"
	TMR3DUTY1 = 1000-1; //u16 //50% 负占空比 PB2
//	TMR3DUTY2 = 12000*3- 1; //u16 //75% 负占空比 PE3
	TMR3CON |= BIT(10); //timer5 pwm0, pwm1, pwm2 enable
	TMR3CON |= BIT(0); //Timer enable (defualt work in counter mode)

注意:
如果是在port_pwm.c下写的初始化函数。
打开这个宏,不然程序不会执行

#define TIMER_PWM_EN                    1           //TIMER的PWM区别于LPWM

在bsp_sys_init函数下调用初始化函数

#if PWM_RGB_EN
    pwm_init();
#endif // PWM_RGB_EN
    pwm_port_init();
    /// enable user timer for display & dac
    sys_set_tmr_enable(1, 1);
编写扫描函数
AT(.com_text.rgb)
void rgb_breath_scan(void)      // 5ms  放5ms中断
{
    static u8 cnt = 0;
    static u8 dir = 0;
    static u16 cduty = 0;
    cnt++;
    if(cnt>=20){
        if(dir==0){
        if(cduty<999){
            cduty = cduty + 9;
        }else{
            dir = 1;
            cduty = 999;
        }
        }else{
            if(cduty>9)
            {
                 cduty = cduty - 9;
            }else{
                dir = 0;
                cduty = 0;
            }
        }
        cnt = 0;
    }
        TMR3DUTY1 = cduty;
}

调用扫描函数

在usr_tmr5ms_isr下调用,增加的标志位为真代表播放状态,否则是暂停状态

 if(RGB_LED_flag){
         rgb_breath_scan();
    }else{
     TMR3DUTY1=999;
    }

### 中科蓝讯 2812灯带驱动方法 对于中科蓝讯的2812灯带驱动,通常涉及硬件连接和软件编程两部分。具体实现如下: #### 硬件连接 为了使2812灯带正常工作,需确保其与控制板之间有正确的电气连接。一般情况下,2812灯带有三个主要引脚:VCC(电源正极)、GND(接地)以及DIN(数据输入)。这些引脚应分别对应接到开发板上的相应管脚上[^1]。 ```cpp // Arduino 示例代码用于初始化 NeoPixel LED 条 #include <Adafruit_NeoPixel.h> #define PIN D7 // 定义信号线所接的 GPIO 口编号 #define NUMPIXELS 30 // 设置LED数量 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); // 初始化库 } ``` #### 软件编程 在编写程序来控制WS2812 RGB灯条时,可以采用多种微控制器平台如Arduino、ESP系列等,并利用特定于该设备类型的库函数简化操作过程。例如,在Arduino环境中可借助`Adafruit_NeoPixel`库轻松完成色彩设置等功能。 ```cpp void loop() { // 遍历所有像素并逐一改变颜色 for(int i=0; i<NUMPIXELS; i++) { setPixelColor(i, wheel((i*256 / NUMPIXELS) & 255)); pixels.show(); delay(5); // 延迟一段时间以便观察效果 } } uint32_t Wheel(byte Position) { if(Position < 85) { return pixels.Color(Position * 3, 255 - Position * 3, 0); } else if(Position < 170) { Position -= 85; return pixels.Color(255 - Position * 3, 0, Position * 3); } else { Position -= 170; return pixels.Color(0, Position * 3, 255 - Position * 3); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值