2501_91140566 2025-10-22 11:43 采纳率: 0%
浏览 5

如何使用MPLAB做出SPWM訊號

我用了MPALB中的MCC生成PWM訊號並且在PWM訊號的CODE中更改了使他生成的不只是PWM而是SPWM但是我現在遇到的問題是我是用學長的閉迴路檔案自己改成開迴路但是始終無法成功

img

unsigned short phase=0, ZeroCrossing=0;
unsigned short i=0, j=1, k=0;

const int16_t Vdc = 574;    //VDC = 48V



//open loop table
const int16_t VrefTable[334]={
    {0},{38},{76},{114},{153},{191},{229},{267},{305},{343},{381},{419},{457},{495},{533},{571},{608},{646},{684},{721},{759},{796},{834},{871},{908},{945},{982},{1019},{1056},{1093},{1130},{1166},{1203},{1239},{1276},{1312},{1348},{1384},{1420},{1455},{1491},{1526},{1562},{1597},{1632},{1667},{1701},{1736},{1770},{1805},{1839},{1873},{1906},{1940},{1973},{2007},{2040},{2073},{2105},{2138},{2170},{2202},{2234},{2266},{2298},{2329},{2360},{2391},{2422},{2452},{2483},{2513},{2543},{2572},{2602},{2631},{2660},{2688},{2717},{2745},{2773},{2801},{2828},{2856},{2883},{2909},{2936},{2962},{2988},{3014},{3039},{3064},{3089},{3114},{3138},{3162},{3186},{3209},{3233},{3256},{3278},{3301},{3323},{3344},{3366},{3387},{3408},{3428},{3449},{3469},{3488},{3508},{3527},{3545},{3564},{3582},{3600},{3617},{3634},{3651},{3668},{3684},{3700},{3715},{3730},{3745},{3760},{3774},{3788},{3801},{3814},{3827},{3840},{3852},{3864},{3875},{3886},{3897},{3908},{3918},{3927},{3937},{3946},{3955},{3963},{3971},{3979},{3986},{3993},{4000},{4006},{4012},{4017},{4022},{4027},{4032},{4036},{4040},{4043},{4046},{4049},{4051},{4053},{4055},{4056},{4057},{4057},{4058},{4057},{4057},{4056},{4055},{4053},{4051},{4049},{4046},{4043},{4040},{4036},{4032},{4027},{4022},{4017},{4012},{4006},{4000},{3993},{3986},{3979},{3971},{3963},{3955},{3946},{3937},{3927},{3918},{3908},{3897},{3886},{3875},{3864},{3852},{3840},{3827},{3814},{3801},{3788},{3774},{3760},{3745},{3730},{3715},{3700},{3684},{3668},{3651},{3634},{3617},{3600},{3582},{3564},{3545},{3527},{3508},{3488},{3469},{3449},{3428},{3408},{3387},{3366},{3344},{3323},{3301},{3278},{3256},{3233},{3209},{3186},{3162},{3138},{3114},{3089},{3064},{3039},{3014},{2988},{2962},{2936},{2909},{2883},{2856},{2828},{2801},{2773},{2745},{2717},{2688},{2660},{2631},{2602},{2572},{2543},{2513},{2483},{2452},{2422},{2391},{2360},{2329},{2298},{2266},{2234},{2202},{2170},{2138},{2105},{2073},{2040},{2007},{1973},{1940},{1906},{1873},{1839},{1805},{1770},{1736},{1701},{1667},{1632},{1597},{1562},{1526},{1491},{1455},{1420},{1384},{1348},{1312},{1276},{1239},{1203},{1166},{1130},{1093},{1056},{1019},{982},{945},{908},{871},{834},{796},{759},{721},{684},{646},{608},{571},{533},{495},{457},{419},{381},{343},{305},{267},{229},{191},{153},{114},{76},{38}
    
};
int32_t Buck_PWM = 0, Boost_PWM = 0;
int32_t boost_dynamic_coefficient = 0;
int16_t finallyDuty_buck = 0;
int16_t finallyDuty_boost = 0;
int32_t B_Coefficient_BOOST_finally[3]={0,0,0};
void __attribute__ ((weak)) PWM_Generator1_CallBack(void)
{
    // Add Application code here
    ZeroCrossing = PORTDbits.RD0 ^ phase;
    phase = PORTDbits.RD0;
    if ( ZeroCrossing == 1 || i > 333 ) i = 0;
    if ( VrefTable[i] >= Vdc ) {
        BOOST_DUTY();
        if ( phase == 1 ) Buck_PWM = 12500;
        else Buck_PWM = 0;
    }
    else{
        BUCK_DUTY();
        Boost_PWM = 0;
    }
    //PG1DC = Buck_PWM;
    //PG2DC = Boost_PWM;
}

void BOOST_DUTY() 
{
    Boost_PWM = VrefTable[i] - Vdc;
    Boost_PWM *= 12500;
    Boost_PWM /= VrefTable[i] + Vdc;
    if ( Boost_PWM >= 12500) Boost_PWM = 12500;
    else if (Boost_PWM <= 0) Boost_PWM = 0;
}

void BUCK_DUTY() 
{
    Buck_PWM = VrefTable[i];
    Buck_PWM *= 6250;
    Buck_PWM /= Vdc;
    if ( phase == 1 ){
        Buck_PWM = 6250 + Buck_PWM;
    }
    else {
        Buck_PWM = 6250 - Buck_PWM;
    }
    if ( Buck_PWM >= 12500) Buck_PWM = 12500;
    else if (Buck_PWM <= 0) Buck_PWM = 0;
}

void PWM_SetGenerator1InterruptHandler(void *handler)
{
    PWM_Generator1InterruptHandler = handler;
}

void __attribute__ ( ( interrupt, no_auto_psv ) ) _PWM1Interrupt (  )
{
    if(PWM_Generator1InterruptHandler)
    {
        // PWM Generator1 interrupt handler function
        PWM_Generator1InterruptHandler();
    }
    
    // clear the PWM Generator1 interrupt flag
    IFS4bits.PWM1IF = 0; 
}

void __attribute__ ((weak)) PWM_Generator2_CallBack(void)
{
    // Add Application code here
}

void PWM_Generator2_Tasks(void)
{
    if(IFS4bits.PWM2IF)
    {
        // PWM Generator2 callback function 
        PWM_Generator2_CallBack();

        // clear the PWM Generator2 interrupt flag
        IFS4bits.PWM2IF = 0;
    }
}

void __attribute__ ((weak)) PWM_Generator7_CallBack(void)
{
    // Add Application code here
    if ( j > 10 ) j = 1;
    if ( j <= 5 ) {
        PG7DC = 52083;
    }
    else {
        PG7DC = 0x00;
    }
    j++;
}

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-10-22 12:07
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    首先,SPWM(脉冲宽度调制)和PWM(脉冲宽度调制)都是用于控制电机的调制技术。闭迴路和开迴路的区别在于闭迴路是通过电机自身的反馈来控制电机的速度,而开迴路是通过外部的速度检测器来控制电机的速度。

    如果你是从闭迴路文件改成开迴路文件,可能是因为你没有正确地配置开迴路的参数。下面是一些可能的解决方案:

    1. 检查配置文件:确保你已经正确地配置了开迴路的参数,包括速度检测器的类型、电机的参数等。
    2. 检查PWM信号的配置:确保你已经正确地配置了PWM信号的参数,包括频率、分辨率等。
    3. 检查代码:检查你的代码是否正确地实现了开迴路的控制逻辑。

    核心代码

    以下是核心代码片段,用于生成SPWM信号:

    // 配置PWM信号的参数
    PWM_InitTypeDef PWM_InitStruct;
    PWM_InitStruct.PWM_Period = 1000; // PWM周期
    PWM_InitStruct.PWM_DutyCycle = 50; // PWM占空比
    PWM_InitStruct.PWM_OutputMode = PWM_OutputMode_Alternate; // PWM输出模式
    
    // 初始化PWM信号
    PWM_Init(PWM_InitStruct);
    
    // 生成SPWM信号
    while(1) {
        // 读取速度检测器的值
        uint16_t speed = GetSpeed();
    
        // 计算SPWM信号的占空比
        uint16_t dutyCycle = (uint16_t)((float)speed / 100 * 100);
    
        // 设置PWM信号的占空比
        PWM_SetDutyCycle(dutyCycle);
    }
    

    注意:上述代码片段仅供参考,具体的实现细节可能会根据你的MCU和开发板的不同而有所不同。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月22日