cpholr1 发表于 2017-3-18 01:01:05

随便做了个SPWM测试 分享代码和实测图形

http://www.amobbs.com/thread-5545884-1-1.html

今晚翻帖子看到这个,挺有兴趣。
顺便玩了一下SPWM。



硬件不是逆变器的硬件,而是随便拿以前的2015年的样品驱动器搭了个电感+电容,还是可以满足SPWM测试条件的。

PWM周期:20us
PWM频率:50khz
电压:24V左右

然后用了论坛的一个哥们的SPWM生成软件做了下数组,忘了是哪个帖子了。



主要代码如下:(STM32F103)

#include "main.h"

short table1000 =
{
0,8,16,25,33,41,49,57,65,73,
82,90,98,106,114,122,130,139,147,155,
163,171,179,187,195,203,211,219,228,236,
244,252,260,268,276,284,292,300,307,315,
323,331,339,347,355,363,371,378,386,394,
402,409,417,425,433,440,448,456,463,471,
479,486,494,501,509,516,524,531,539,546,
554,561,568,576,583,590,597,605,612,619,
626,633,641,648,655,662,669,676,683,690,
697,703,710,717,724,731,737,744,751,757,
764,771,777,784,790,797,803,810,816,822,
829,835,841,847,854,860,866,872,878,884,
890,896,902,908,913,919,925,931,936,942,
948,953,959,964,970,975,981,986,991,996,
1002,1007,1012,1017,1022,1027,1032,1037,1042,1047,
1052,1057,1061,1066,1071,1075,1080,1084,1089,1093,
1098,1102,1106,1111,1115,1119,1123,1127,1131,1135,
1139,1143,1147,1151,1155,1158,1162,1166,1169,1173,
1176,1180,1183,1186,1190,1193,1196,1199,1203,1206,
1209,1212,1215,1218,1220,1223,1226,1229,1231,1234,
1236,1239,1241,1244,1246,1248,1251,1253,1255,1257,
1259,1261,1263,1265,1267,1269,1270,1272,1274,1275,
1277,1278,1280,1281,1283,1284,1285,1286,1288,1289,
1290,1291,1292,1293,1293,1294,1295,1296,1296,1297,
1297,1298,1298,1299,1299,1299,1300,1300,1300,1300,
1300,1300,1300,1300,1300,1299,1299,1299,1298,1298,
1297,1297,1296,1296,1295,1294,1293,1293,1292,1291,
1290,1289,1288,1286,1285,1284,1283,1281,1280,1278,
1277,1275,1274,1272,1270,1269,1267,1265,1263,1261,
1259,1257,1255,1253,1251,1248,1246,1244,1241,1239,
1236,1234,1231,1229,1226,1223,1220,1218,1215,1212,
1209,1206,1203,1199,1196,1193,1190,1186,1183,1180,
1176,1173,1169,1166,1162,1158,1155,1151,1147,1143,
1139,1135,1131,1127,1123,1119,1115,1111,1106,1102,
1098,1093,1089,1084,1080,1075,1071,1066,1061,1057,
1052,1047,1042,1037,1032,1027,1022,1017,1012,1007,
1002,996,991,986,981,975,970,964,959,953,
948,942,936,931,925,919,913,908,902,896,
890,884,878,872,866,860,854,847,841,835,
829,822,816,810,803,797,790,784,777,771,
764,757,751,744,737,731,724,717,710,703,
697,690,683,676,669,662,655,648,641,633,
626,619,612,605,597,590,583,576,568,561,
554,546,539,531,524,516,509,501,494,486,
479,471,463,456,448,440,433,425,417,409,
402,394,386,378,371,363,355,347,339,331,
323,315,307,300,292,284,276,268,260,252,
244,236,228,219,211,203,195,187,179,171,
163,155,147,139,130,122,114,106,98,90,
82,73,65,57,49,41,33,25,16,8,
0,-8,-16,-25,-33,-41,-49,-57,-65,-73,
-82,-90,-98,-106,-114,-122,-130,-139,-147,-155,
-163,-171,-179,-187,-195,-203,-211,-219,-228,-236,
-244,-252,-260,-268,-276,-284,-292,-300,-307,-315,
-323,-331,-339,-347,-355,-363,-371,-378,-386,-394,
-402,-409,-417,-425,-433,-440,-448,-456,-463,-471,
-479,-486,-494,-501,-509,-516,-524,-531,-539,-546,
-554,-561,-568,-576,-583,-590,-597,-605,-612,-619,
-626,-633,-641,-648,-655,-662,-669,-676,-683,-690,
-697,-703,-710,-717,-724,-731,-737,-744,-751,-757,
-764,-771,-777,-784,-790,-797,-803,-810,-816,-822,
-829,-835,-841,-847,-854,-860,-866,-872,-878,-884,
-890,-896,-902,-908,-913,-919,-925,-931,-936,-942,
-948,-953,-959,-964,-970,-975,-981,-986,-991,-996,
-1002,-1007,-1012,-1017,-1022,-1027,-1032,-1037,-1042,-1047,
-1052,-1057,-1061,-1066,-1071,-1075,-1080,-1084,-1089,-1093,
-1098,-1102,-1106,-1111,-1115,-1119,-1123,-1127,-1131,-1135,
-1139,-1143,-1147,-1151,-1155,-1158,-1162,-1166,-1169,-1173,
-1176,-1180,-1183,-1186,-1190,-1193,-1196,-1199,-1203,-1206,
-1209,-1212,-1215,-1218,-1220,-1223,-1226,-1229,-1231,-1234,
-1236,-1239,-1241,-1244,-1246,-1248,-1251,-1253,-1255,-1257,
-1259,-1261,-1263,-1265,-1267,-1269,-1270,-1272,-1274,-1275,
-1277,-1278,-1280,-1281,-1283,-1284,-1285,-1286,-1288,-1289,
-1290,-1291,-1292,-1293,-1293,-1294,-1295,-1296,-1296,-1297,
-1297,-1298,-1298,-1299,-1299,-1299,-1300,-1300,-1300,-1300,
-1300,-1300,-1300,-1300,-1300,-1299,-1299,-1299,-1298,-1298,
-1297,-1297,-1296,-1296,-1295,-1294,-1293,-1293,-1292,-1291,
-1290,-1289,-1288,-1286,-1285,-1284,-1283,-1281,-1280,-1278,
-1277,-1275,-1274,-1272,-1270,-1269,-1267,-1265,-1263,-1261,
-1259,-1257,-1255,-1253,-1251,-1248,-1246,-1244,-1241,-1239,
-1236,-1234,-1231,-1229,-1226,-1223,-1220,-1218,-1215,-1212,
-1209,-1206,-1203,-1199,-1196,-1193,-1190,-1186,-1183,-1180,
-1176,-1173,-1169,-1166,-1162,-1158,-1155,-1151,-1147,-1143,
-1139,-1135,-1131,-1127,-1123,-1119,-1115,-1111,-1106,-1102,
-1098,-1093,-1089,-1084,-1080,-1075,-1071,-1066,-1061,-1057,
-1052,-1047,-1042,-1037,-1032,-1027,-1022,-1017,-1012,-1007,
-1002,-996,-991,-986,-981,-975,-970,-964,-959,-953,
-948,-942,-936,-931,-925,-919,-913,-908,-902,-896,
-890,-884,-878,-872,-866,-860,-854,-847,-841,-835,
-829,-822,-816,-810,-803,-797,-790,-784,-777,-771,
-764,-757,-751,-744,-737,-731,-724,-717,-710,-703,
-697,-690,-683,-676,-669,-662,-655,-648,-641,-633,
-626,-619,-612,-605,-597,-590,-583,-576,-568,-561,
-554,-546,-539,-531,-524,-516,-509,-501,-494,-486,
-479,-471,-463,-456,-448,-440,-433,-425,-417,-409,
-402,-394,-386,-378,-371,-363,-355,-347,-339,-331,
-323,-315,-307,-300,-292,-284,-276,-268,-260,-252,
-244,-236,-228,-219,-211,-203,-195,-187,-179,-171,
-163,-155,-147,-139,-130,-122,-114,-106,-98,-90,
-82,-73,-65,-57,-49,-41,-33,-25,-16,-8
};

//PWM---TIM1_CH2(PA9)
//PWM---TIM1_CH2N(PB14)

//PWM---TIM1_CH3(PA10)
//PWM---TIM1_CH3N(PB15)

/*************************************************************************
                              PWM init
*************************************************************************/
void PWM_Configuration(void)
{
        TIM_TimeBaseInitTypeDeftim;
        TIM_OCInitTypeDef      oc;
    GPIO_InitTypeDef         gpio;
    TIM_BDTRInitTypeDef      bdtr;
    NVIC_InitTypeDef         nvic;
   
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE);       

           gpio.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
        gpio.GPIO_Mode = GPIO_Mode_AF_PP;
        gpio.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &gpio);

           gpio.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
        gpio.GPIO_Mode = GPIO_Mode_AF_PP;
        gpio.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &gpio);

    tim.TIM_Period = 1440;   //72MHz   1440/72 = 20us
        tim.TIM_Prescaler = 0;
        tim.TIM_ClockDivision = TIM_CKD_DIV1;
        tim.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM1, &tim);

    bdtr.TIM_OSSRState = TIM_OSSRState_Disable;
    bdtr.TIM_OSSIState = TIM_OSSIState_Disable;
    bdtr.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
    bdtr.TIM_DeadTime = 10;
    bdtr.TIM_Break = TIM_Break_Disable;
    bdtr.TIM_BreakPolarity = TIM_BreakPolarity_Low;
    bdtr.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
    TIM_BDTRConfig(TIM1, &bdtr);

    oc.TIM_OCMode = TIM_OCMode_PWM1;
    oc.TIM_OutputState = TIM_OutputState_Enable;
    oc.TIM_OutputNState = TIM_OutputNState_Enable;
    oc.TIM_Pulse = 0;
    oc.TIM_OCPolarity = TIM_OCPolarity_High;
    oc.TIM_OCNPolarity = TIM_OCNPolarity_High;
    oc.TIM_OCIdleState = TIM_OCIdleState_Reset;
    oc.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
    TIM_OC2Init(TIM1,&oc);
    TIM_OC3Init(TIM1,&oc);
   
    nvic.NVIC_IRQChannel = TIM1_UP_IRQn;
    nvic.NVIC_IRQChannelPreemptionPriority = 0;
    nvic.NVIC_IRQChannelSubPriority = 0;
    nvic.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvic);
   
    TIM_ITConfig(TIM1, TIM_IT_Update,ENABLE);
    TIM_ClearFlag(TIM1, TIM_FLAG_Update);
   
        TIM_ARRPreloadConfig(TIM1, ENABLE);
   
    TIM_CtrlPWMOutputs(TIM1,ENABLE);

        TIM_Cmd(TIM1, ENABLE);
}

unsigned int irq_cnt = 0;

void TIM1_UP_IRQHandler(void)
{
    unsigned int n = 0;
   
    if (TIM_GetITStatus(TIM1,TIM_IT_Update)!= RESET)
    {
      n = irq_cnt%1000;
      
      if(n<=500)
      {
            TIM1->CCR2 = abs(table1000);
            TIM1->CCR3 = 0;
      }
      else if(n>500)
      {
            TIM1->CCR3 = abs(table1000);
            TIM1->CCR2 = 0;
      }

      irq_cnt ++;
      
      LED_RED_TOGGLE();
      TIM_ClearFlag(TIM1, TIM_FLAG_Update);
    }
}


最终实测波形生成:


发现,jlink接着电脑,当示波器的夹子,夹到电感的输出端,就像是短路了似的,电源箱过流报警,JLINK自动从电脑断开。
然后把jlink从电脑拔掉,就不短路了。

另外,在上述正常情况的基础上,用示波器探头测量正弦波的时候,电源箱显示电流会变大25mA左右,断开示波器探头,就正常了。
不懂为何了。

yunhuisong 发表于 2017-3-18 01:26:50

深夜顶贴

OOXX110 发表于 2017-3-18 10:57:44

厉害{:smile:}

xuyapple 发表于 2017-3-18 11:25:13

jlink接着电脑,跟控制板是共地的,直接去测电感的输出端,就等于把电感的输出端和控制板的地短接了;示波器没接隔离变压器或者没使用隔离探头,示波器地线和电网地线是接在一起的,用示波器探头测量正弦波的时候,同样会把两个地方短接,有可能导致电流增加的问题。

zzipeng 发表于 2017-3-19 21:54:14

输出端接个电容电感是用来低通滤波,相当于DA的么?

ibmx311 发表于 2017-3-22 22:51:16

1000点有些少,10000点还可以

cpholr1 发表于 2017-3-22 23:44:59

ibmx311 发表于 2017-3-22 22:51
1000点有些少,10000点还可以

你的这个幅值为何不同?

ibmx311 发表于 2017-3-23 00:20:58

两路都是可以恒压恒流并且相位可调的

fengyunyu 发表于 2017-3-23 07:08:13

高手,高深!

R88 发表于 2017-3-23 08:58:22

示波器接大地的探头测量时,当探头地不和电路地相连时测量波形,电流会增加,而且有时候导致波形不正常会有异响。我之前就发现过。 我当时测过好几个DCDC,输入是有菊水电源供电。后来就用手持示波器测量电流不会增加。分析虽然菊水电源输出是隔离的,但是示波器的地测量点是高频信号,可能通过Y电容或者寄生电容形成回路了。

ibmx311 发表于 2017-3-23 11:56:02

我所有的桌面仪器都会有一个隔离变压器

foxpro2005 发表于 2017-3-23 13:05:58

本帖最后由 foxpro2005 于 2017-3-23 13:11 编辑

做得不错。。。   再给点建议:
对你前面说的问题, 玩逆变, 在调试或仿真时, 以及测试, 一定要注意的!
电脑(下载器 或 通信接口)、电源、 示波器等,别以为它们都叫GND, 而把它们直接连在一起, 是会出问题的(有时还有可能出大问题!!)。
1) 因为这些的GND(地), 是不对等的(不是相同的电气回路)!我们在调试或测量时, 一般都采取供电隔离的方式, 也就是使用1:1的隔离变压器, 把各自的市电供电电源隔开(使其独立)。
2) 示波器的话,供电可以使用隔离变压器, 也可以将电源线插头接地脚 扳掉, 还可以使用差分探头。

hy2515131 发表于 2017-4-17 18:44:55

mark SPWM 实验测试带数据

喜欢雪的人 发表于 2018-5-6 08:29:36

高手!!{:smile:}

No.5 发表于 2018-5-6 09:41:33

这是开环的吧?

dory_m 发表于 2019-1-22 20:11:02

谢谢,学习!!!
页: [1]
查看完整版本: 随便做了个SPWM测试 分享代码和实测图形