spwm单项并网的实现

并网问题,最近老师布置了一道并网的问题,博主之前也有尝试过,不过之前做的不深。
至于这一个问题,解释起来比较麻烦,相信做过或者了解过的人应该知道,简单来说,就是一个同步。

我们知道,220v 50hz的电网波动其实还是有的,一般认为波动在49.5~50.5Hz左右变换,我们用变压器变压过来,通过一个比较器等可以整形成一个脉冲波,我们测脉冲波的频率就可以知道此时电网的频率。

提前说明

spwm说明

在实现spwm波形时,将源建议的400个pwm改成672个pwm方便扩展精度
当频率在49.5~50.5Hz变动时,更改原因:

1. 配置400个点时,对应pwm个数(波表个数)变动范围404~396,上下变动为8
2. 配置672个点时,对应pwm个数(波表个数)变动范围678~665,上下变动为13
3. 变动范围增大,为下面避免单个增加pwm个数做准备

pwm初始化函数

TIM1_PWM_Out_Init(1000-1,5-1,48);

TIM1时钟为168M,对应单个pwm频率为 168 1000000 / 1000 / 5 = 33.6 k h H z
672个pwm波形滤波之后,可以对应50hz正弦波波形
1

增加输入频率

增加输入频率,在不改变点数情况下

原理分析

输入频率增加,对应输入方波的周期变小,而672pwm输出点数不变,势必会造成
spwm波形被部分截取,具体是尾部截取

现象分析

2

现象及过程·分析

随着频率的增加,即采样进来的方波信号周期变小,出现发波表过多,这时候,程序认为:

  • 波表数没有发完,这时候,捕获到上升沿标志了,使能一次定时器溢出更新中断(程序原设定要求)
  • 当剩余几个波表发完成后,应该清楚波表计数,同时关闭定时器更新中断,等待下一次捕获到来使能更新断
  • 此时,由于上升沿来之后,波表才发完,造成,下一次中断更新在下一次上升沿来

即:下一个方波来,才会重新输出,中间间隔段为定时器关闭情况
解决办法:减少波表个数,使上升沿来是波表刚好发完或者,在上升沿来之前把波表发完

减少输入频率,在不改变点数的情况下

原理分析

输入频率变小,即方波周期变大,出现发出672波点数不足的情况,会造成spwm波提早结束,具体spwm波结束有一段横线(定时器提前关闭造成)

现象分析:

3
A:波表发送完毕,下一次捕获还未来
B:定时器关闭,等待下一次捕获来临,定时器不输出
C:下一次捕获,上升沿到来,重新打开定时器
解决办法:增加波表个数,使波表发送完毕时,下一次上升沿刚好到来

同步办法

计算pwm个数

经过验证,方便波表的选取,pwm个数为偶
4
ps:在一个误差周期内,实际给出误差以红色为主。

程序实现

void Frequency_take(void)
{
       if(Frequency<49.5f){cnt_start=1;frequencyNum=339;}
       if(Frequency>=49.5f && Frequency<49.6f){cnt_start=1;frequencyNum=339;}//49.5+3补充
       if(Frequency>=49.6f && Frequency<49.7f){cnt_start=2;frequencyNum=338;}//49.6
       if(Frequency>=49.7f && Frequency<49.8f){cnt_start=2;frequencyNum=338;}//49.7
       if(Frequency>=49.8f && Frequency<49.9f){cnt_start=2;frequencyNum=337;}//49.8
       if(Frequency>=49.9f && Frequency<50.0f){cnt_start=3;frequencyNum=336;}//49.9
       if(Frequency>=50.0f && Frequency<50.1f){cnt_start=3;frequencyNum=336;}//50
       if(Frequency>=50.1f && Frequency<50.2f){cnt_start=4;frequencyNum=335;}//50.1
       if(Frequency>=50.2f && Frequency<50.3f){cnt_start=4;frequencyNum=334;}//50.2
       if(Frequency>=50.3f && Frequency<50.4f){cnt_start=4;frequencyNum=334;}//50.3
       if(Frequency>=50.4f && Frequency<50.5f){cnt_start=5;frequencyNum=333;}//50.4
       if(Frequency>=50.5f && Frequency<50.6f){cnt_start=4;frequencyNum=333;}//50.5
       if(Frequency>50.5f){cnt_start=5;frequencyNum=332;}
}

中断处理部分

更改点数处理

void TIM1_UP_TIM10_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET) 
    {
    TIM3->CR1 &= (uint16_t)~TIM_CR1_CEN;

        if(dir_flag==1){//半波翻转标志位
            TIM1->CCR1 = arr*(0.5f+coefficient*sin_table[cnt++]);
            if(cnt>=frequencyNum){dir_flag=0;cnt=cnt_start;}
        }
        else{
            TIM1->CCR1 = arr*(0.5f-coefficient*sin_table[cnt++]);
            if(cnt>=frequencyNum){
                    dir_flag=1;cnt=cnt_start;
                    TIM_ITConfig(TIM1,TIM_IT_Update,DISABLE);    
                    GPIO_ResetBits(GPIOD,GPIO_Pin_1);
            }
        }

    TIM3->CR1 |= TIM_CR1_CEN;    
    }
    TIM_ClearITPendingBit(TIM1,TIM_IT_Update); 
}

程序说明

按计算,50hz对应半波点数为336个点数,人为在波表前面各加三个数,将波表改成336+3+3=342个波表

double sin_table[342]={
-1.000, -1.000, -1.000,

-1.000, -1.000, -1.000, -1.000, -0.999, -0.999, -0.998, -0.998, -0.997, -0.996,
-0.996, -0.995, -0.994, -0.993, -0.991, -0.990, -0.989, -0.987, -0.986, -0.984,
-0.983, -0.981, -0.979, -0.977, -0.975, -0.973, -0.971, -0.968, -0.966, -0.964,
-0.961, -0.958, -0.956, -0.953, -0.950, -0.947, -0.944, -0.941, -0.938, -0.934,
-0.931, -0.927, -0.924, -0.920, -0.917, -0.913, -0.909, -0.905, -0.901, -0.897,
-0.893, -0.889, -0.884, -0.880, -0.875, -0.871, -0.866, -0.861, -0.857, -0.852,
-0.847, -0.842, -0.837, -0.832, -0.826, -0.821, -0.816, -0.810, -0.805, -0.799,
-0.793, -0.788, -0.782, -0.776, -0.770, -0.764, -0.758, -0.752, -0.746, -0.739,
-0.733, -0.727, -0.720, -0.714, -0.707, -0.701, -0.694, -0.687, -0.680, -0.673,
-0.666, -0.659, -0.652, -0.645, -0.638, -0.631, -0.624, -0.616, -0.609, -0.601,
-0.594, -0.586, -0.579, -0.571, -0.563, -0.556, -0.548, -0.540, -0.532, -0.524,
-0.516, -0.508, -0.500, -0.492, -0.484, -0.476, -0.467, -0.459, -0.451, -0.442,
-0.434, -0.426, -0.417, -0.409, -0.400, -0.391, -0.383, -0.374, -0.365, -0.357,
-0.348, -0.339, -0.330, -0.322, -0.313, -0.304, -0.295, -0.286, -0.277, -0.268,
-0.259, -0.250, -0.241, -0.232, -0.223, -0.214, -0.204, -0.195, -0.186, -0.177,
-0.168, -0.158, -0.149, -0.140, -0.131, -0.121, -0.112, -0.103, -0.094, -0.084,
-0.075, -0.066, -0.056, -0.047, -0.038, -0.028, -0.019, -0.009,

-0.000, 0.009, 0.019, 0.028, 0.037, 0.047, 0.056, 0.065, 0.075, 0.084,
0.093, 0.103, 0.112, 0.121, 0.130, 0.140, 0.149, 0.158, 0.167, 0.177,
0.186, 0.195, 0.204, 0.213, 0.222, 0.231, 0.241, 0.250, 0.259, 0.268,
0.277, 0.286, 0.295, 0.304, 0.312, 0.321, 0.330, 0.339, 0.348, 0.356,
0.365, 0.374, 0.383, 0.391, 0.400, 0.408, 0.417, 0.425, 0.434, 0.442,
0.451, 0.459, 0.467, 0.475, 0.484, 0.492, 0.500, 0.508, 0.516, 0.524,
0.532, 0.540, 0.548, 0.555, 0.563, 0.571, 0.579, 0.586, 0.594, 0.601,
0.609, 0.616, 0.623, 0.631, 0.638, 0.645, 0.652, 0.659, 0.666, 0.673,
0.680, 0.687, 0.694, 0.700, 0.707, 0.714, 0.720, 0.727, 0.733, 0.739,
0.746, 0.752, 0.758, 0.764, 0.770, 0.776, 0.782, 0.788, 0.793, 0.799,
0.805, 0.810, 0.815, 0.821, 0.826, 0.831, 0.837, 0.842, 0.847, 0.852,
0.856, 0.861, 0.866, 0.871, 0.875, 0.880, 0.884, 0.888, 0.893, 0.897,
0.901, 0.905, 0.909, 0.913, 0.917, 0.920, 0.924, 0.927, 0.931, 0.934,
0.937, 0.941, 0.944, 0.947, 0.950, 0.953, 0.956, 0.958, 0.961, 0.963,
0.966, 0.968, 0.971, 0.973, 0.975, 0.977, 0.979, 0.981, 0.983, 0.984,
0.986, 0.987, 0.989, 0.990, 0.991, 0.993, 0.994, 0.995, 0.996, 0.996,
0.997, 0.998, 0.998, 0.999, 0.999, 1.000, 1.000, 1.000,

1.000, 1.000, 1.000
};

当频率改变时,我们只要改变整个波表起始位置就可以.比如,当输入方波信号为49.5,通过计算,应当输出678个pwm对应半波339个
程序中设置cnt_start=1,frequencyNum=339,遍历波表时从第一个数到第339个数,共339个数,对应使用336个波表时,我们额外补充的前3个数中的第2和3个 -1.000 和后三个数中第一个1.000,也就是将缺少的3个pwm补上

同样其他频率变化时,实现同步。

猜你喜欢

转载自blog.csdn.net/klaus_x/article/details/80115196