基于dsp28335的单相逆变整套DSP28335,程序功能齐全包含adc采样模块,pwm控制模块配置,液晶显示单相锁相环电路保护程序等

最近在搞一个基于DSP28335的单相逆变项目,感觉挺有意思的,分享一下我的思路和代码。这个项目功能比较全,包含了ADC采样、PWM控制、液晶显示、单相锁相环以及电路保护等模块。下面我会逐一拆解,顺便贴点代码,方便大家理解。

ADC采样模块

首先,ADC采样是逆变器的基础,毕竟你得知道输入电压和电流才能做后续的控制。DSP28335的ADC模块用起来还算顺手,配置起来也不复杂。下面是一个简单的ADC初始化代码:

void InitAdc(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // 使能ADC时钟
    EDIS;

    AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF; // 采样窗口时间
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x3; // ADC时钟分频
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联模式
    AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 连续运行模式
    AdcRegs.ADCMAXCONV.bit.MAX_CONV = 0x1; // 最大转换通道数
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 选择通道0
    AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // 启动SEQ1
}

这段代码主要配置了ADC的时钟、采样窗口、分频等参数。ADCMAXCONV设置了最大转换通道数,这里只用了通道0。SOC_SEQ1启动SEQ1,开始采样。

PWM控制模块

PWM控制是逆变器的核心,DSP28335的PWM模块功能强大,配置起来稍微复杂一点。下面是一个PWM初始化的代码片段:

void InitPwm(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 停止TBCLK
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // 启动TBCLK
    EDIS;

    EPwm1Regs.TBPRD = 1000; // 设置PWM周期
    EPwm1Regs.TBPHS.bit.TBPHS = 0; // 相位寄存器清零
    EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 增计数模式
    EPwm1Regs.TBCTL.bit.PHSEN = 0; // 禁止相位加载
    EPwm1Regs.TBCTL.bit.PRDLD = 1; // 立即加载周期寄存器
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; // 同步输出选择
    EPwm1Regs.CMPA.bit.CMPA = 500; // 设置比较寄存器A
    EPwm1Regs.AQCTLA.bit.CAU = 2; // 比较匹配时置高
    EPwm1Regs.AQCTLA.bit.CAD = 1; // 比较匹配时置低
}

这段代码配置了PWM的周期、相位、计数模式等。TBPRD设置了PWM的周期,CMPA设置了比较寄存器的值,AQCTLA配置了比较匹配时的动作。

液晶显示模块

液晶显示模块用来实时显示电压、电流等信息。这里我用的是1602液晶屏,驱动代码比较简单:

void LcdDisplay(float voltage, float current)
{
    char buffer[16];
    sprintf(buffer, "V: %.2f I: %.2f", voltage, current);
    Lcd_SetCursor(0, 0);
    Lcd_Print(buffer);
}

这个函数将电压和电流格式化为字符串,然后显示在液晶屏上。sprintf用来格式化字符串,LcdSetCursor设置光标位置,LcdPrint输出字符串。

单相锁相环

单相锁相环(PLL)用来同步电网电压的频率和相位。DSP28335的PLL模块配置如下:

void InitPll(void)
{
    EALLOW;
    SysCtrlRegs.PLLCR.bit.DIV = 10; // 设置PLL分频
    EDIS;

    while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1); // 等待PLL锁定
}

这段代码配置了PLL的分频,并等待PLL锁定。PLLCR设置了分频值,PLLSTS用来检查PLL是否锁定。

电路保护程序

电路保护是逆变器安全运行的关键。这里我实现了一个简单的过流保护:

void OverCurrentProtection(float current)
{
    if(current > MAX_CURRENT)
    {
        EPwm1Regs.TBCTL.bit.CTRMODE = 3; // 停止PWM
        Lcd_SetCursor(1, 0);
        Lcd_Print("Over Current!");
    }
}

这个函数检测电流是否超过最大值,如果超过则停止PWM输出,并在液晶屏上显示“Over Current!”。

总结

这个基于DSP28335的单相逆变项目涵盖了ADC采样、PWM控制、液晶显示、单相锁相环和电路保护等多个模块。代码虽然不算复杂,但功能齐全,适合初学者学习和参考。如果你也在做类似的项目,希望这些代码能帮到你。

基于dsp28335的单相逆变整套DSP28335,程序功能齐全包含adc采样模块,pwm控制模块配置,液晶显示单相锁相环电路保护程序等

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐