• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

STM8S完成正弦波逆变器DIY

看论坛上有人用EG8010和TDS2285做逆变器,小弟现在再调试一款STM8S003的小板,感觉资源也够,只要有PWM和ADC应该就差不多,试着想自己编一个程序试试

该程序主要完成STM TIM1的1,2通道互补输出,20K的载波,50hz的基波

#include "IOSTM8S103K3.h"
#include "math.h"
#include 
unsigned char pwm_duty[100];

#define LED PC_ODR_ODR4

#define IN PD_IDR_IDR3

unsigned char t,v;

unsigned char a,i,j,count;

unsigned long k,sum,l;

void math(void)
{  
   unsigned char i;
   for(i=0; i<100; i++)
    {
    //if(j<= 50) pwm_duty[i]=(unsigned char)(0+(float)254*sin(2*3.1415926*(float)i*0.2/(float)20));
    //if(j> 50) pwm_duty[i]=(unsigned char)(254-(float)254*sin(2*3.1415926*(float)i*0.2/(float)20));
    pwm_duty[i]=(unsigned char)(127+(float)127*sin(2*3.1415926*(float)i*0.2/(float)20));
    } 
}

void delay_ms(unsigned int ms)
{
       unsigned char i;
       while(ms!=0)
       {
              for(i=0;i<250;i++)
              {}
              for(i=0;i<75;i++)
              {}
              ms--;
       }
}

void delay_us(unsigned int us)
{
       unsigned char j;
       while(us!=0)
       {
              for(j=0;j<250;j++)
              {}
              us--;
       }
} 

void Init_Timer4(void)
{  
    asm("sim"); 
    TIM4_CR1=0x01;//使能计数器
    TIM4_IER=0x01;//更新中断使能
    TIM4_EGR=0x01;
    TIM4_CNTR=199;//计数器值
    TIM4_ARR=199;//自动重装的值
    TIM4_PSCR=0x04;//分频值128
    asm("rim");//开全局中断,延时16.32ms
}
#pragma vector=TIM4_OVR_UIF_vector//0x19
__interrupt void TIM4_OVR_UIF_IRQHandler(void)//对应IAP的中断地址:0x8060
{
  //asm("JP 0x9060\n");
     
    TIM4_SR=0x00;
    
     if(k>= 100) k=0;
     TIM1_CCR1L = pwm_duty[k];   
    TIM1_CCR2L = pwm_duty[k]; 

   k++;

      //return;
}


void TIM1_CH1_PWM_INIT(void)
 {
  CLK_PCKENR1|=0x80;//开启定时器1外设时钟 
  TIM1_EGR=0x01;//重新初始化TIM1
  TIM1_EGR|=0x20;//重新初始化TIM1
  TIM1_ARRH=0x00;//设定重装载值
  TIM1_ARRL=255;
  
  TIM1_PSCRH=0;//预分频
  TIM1_PSCRL=0x04;
  TIM1_CR1=0;//边沿对齐,向上计数
  
  TIM1_CCER1=0x55;//高电平有效
  TIM1_CCMR1=0x60;//PWM模式1
  TIM1_CCMR2=0x60;//PWM模式1
    
  TIM1_DTR=0x04;
  TIM1_CCR1H=0;//占空比
  TIM1_CCR1L=254;
  TIM1_CCR2H=0;//占空比
  TIM1_CCR2L=254;
  TIM1_CR1|=0x01;//向上计数,无缓存,使能
  TIM1_BKR=0x80;//开启刹车
 }

void TIM2_CH1_PWM_INIT(void)
 {
TIM2_CCMR1 = TIM2_CCMR1 | 0x70;// Output mode PWM2.
TIM2_CCMR3 = TIM2_CCMR3 | 0x70;// Output mode PWM2. 
// 通道2 被设置成比较输出方式
// OC2M = 111,为PWM 模式2,
// 向上计数时,若计数器小于比较值,为无效电平
// 即当计数器在0 到比较值时,输出为1,否则为0
TIM2_CCER1 = TIM2_CCER1 | 0x03;// CC polarity low,enable PWM output */
TIM2_CCER2 = TIM2_CCER2 | 0x03;
// CC2P = 1,低电平为有效电平
// CC2E = 1,开启输出引脚
//初始化自动装载寄存器,决定PWM 方波的频率,Fpwm=4000000/256=15625HZ
TIM2_ARRH = 0;
TIM2_ARRL = 0xFF;
//初始化比较寄存器,决定PWM 方波的占空比
TIM2_CCR1H = 0;
TIM2_CCR1L = 0;
TIM2_CCR3H = 0;
TIM2_CCR3L = 0;
// 初始化时钟分频器为2,即计数器的时钟频率为Fmaster=8MHZ
TIM2_PSCR = 1;
// 启动计数
TIM2_CR1 = TIM2_CR1 | 0x01;
 }



void main( void )
{



          CLK_CKDIVR=0x00;
          math();   
          PA_DDR|=0x08;
	  PA_CR1|=0x08;
	  PA_CR2|=0x00;
          
          PA_ODR|=0x08;
          
          PC_DDR|=0x58;
	  PC_CR1|=0x58;
	  PC_CR2|=0x00;
          
       //   PC_ODR|=0x58;
          
          PD_DDR|=0x10;
	  PD_CR1|=0x10;
	  PD_CR2|=0x00;
          

        
        Init_Timer4();
        
        TIM1_CH1_PWM_INIT();
        
   //     TIM2_CH1_PWM_INIT();
        
        TIM2_CCR1L = 128;
        TIM2_CCR3L = 0;
        TIM1_CCR1L=128;
        TIM1_CCR2L=128;
             while(1)			
	{

 
 
}

}

 

全部回复(48)
正序查看
倒序查看
2015-01-23 15:16

下面手工焊接硬件

硬件H桥使用4个NCE7580,滤波用的5mh电感(胡乱拿的现成的,没有自己绕),电容用的400V1.5UF 的CBB,LCL滤波结构,驱动使用两片IR2110,电路和EG8010的样板一样

 

0
回复
2015-01-23 15:20
@想飞的狼
下面手工焊接硬件硬件H桥使用4个NCE7580,滤波用的5mh电感(胡乱拿的现成的,没有自己绕),电容用的400V1.5UF的CBB,LCL滤波结构,驱动使用两片IR2110,电路和EG8010的样板一样[图片] 

焊好的硬件如下图示,单片机是TSSOP20的,我直接从现有的要调试的PCB飞线过去,下载程序需要用ST的工具把单片机引脚互用功能调好

 

 

0
回复
2015-01-23 15:25
@想飞的狼
焊好的硬件如下图示,单片机是TSSOP20的,我直接从现有的要调试的PCB飞线过去,下载程序需要用ST的工具把单片机引脚互用功能调好[图片][图片]  

在公司不敢玩高压,爆了被老板看到就玩完了,直接用直流电源做H桥的输入,波形如下

下管互补波形

上管波形也测下,不过只能测一个管子的,上面两个管子不工地

由于没有稳压和保护算法,整流后带载电压下降,并且波形畸变

 

0
回复
2015-01-23 15:29
@想飞的狼
在公司不敢玩高压,爆了被老板看到就玩完了,直接用直流电源做H桥的输入,波形如下[图片]下管互补波形[图片]上管波形也测下,不过只能测一个管子的,上面两个管子不工地[图片]由于没有稳压和保护算法,整流后带载电压下降,并且波形畸变[图片][图片] 

综上所诉,感觉做一个单片机的SPWM程序不难,不过要完成其稳压和保护功能,其实波形的失真与否输出和芯片关系不大,主要是滤波器的设置。不过STM8S成本低,如果不接外部晶振稳定性还行,可以试一试

 

我这边只是我的一些个人见解,论坛里面牛人很多,请指教了

0
回复
mvip
LV.3
6
2015-01-23 15:50
@想飞的狼
综上所诉,感觉做一个单片机的SPWM程序不难,不过要完成其稳压和保护功能,其实波形的失真与否输出和芯片关系不大,主要是滤波器的设置。不过STM8S成本低,如果不接外部晶振稳定性还行,可以试一试 我这边只是我的一些个人见解,论坛里面牛人很多,请指教了

值得借鉴,如果正弦波也用stm8就更牛了。

谢谢分享

0
回复
mvip
LV.3
7
2015-01-23 15:56

我觉得完成升压输出,单片机绰绰有余。如果加上正弦波输出和保护稳压之类功能有点资源不够。

0
回复
ssff
LV.5
8
2015-01-23 16:03
@想飞的狼
综上所诉,感觉做一个单片机的SPWM程序不难,不过要完成其稳压和保护功能,其实波形的失真与否输出和芯片关系不大,主要是滤波器的设置。不过STM8S成本低,如果不接外部晶振稳定性还行,可以试一试 我这边只是我的一些个人见解,论坛里面牛人很多,请指教了

不错啊,很牛的技术。

你这个是和EG8010的SPWM波形一样吗?

0
回复
2015-01-23 16:48
@ssff
不错啊,很牛的技术。你这个是和EG8010的SPWM波形一样吗?
波形不一定一样,因为PWM的分辨率和更新周期不一定相同
0
回复
2015-01-23 16:49
@mvip
我觉得完成升压输出,单片机绰绰有余。如果加上正弦波输出和保护稳压之类功能有点资源不够。

升压也可以完成,但是要考虑两级的隔离

0
回复
2015-01-23 16:53
@想飞的狼
升压也可以完成,但是要考虑两级的隔离

非常不错,鼓励下,置顶!

0
回复
ssff
LV.5
12
2015-01-23 17:11
@想飞的狼
波形不一定一样,因为PWM的分辨率和更新周期不一定相同

不错啊,被版主置顶了,可见大神们对你很看重啊

你这个是一边半桥是高频,一边是工频50HZ的吗?

0
回复
2015-01-23 17:53
@ssff
不错啊,被版主置顶了,可见大神们对你很看重啊你这个是一边半桥是高频,一边是工频50HZ的吗?

不是的,两个半桥都是高频

0
回复
ssff
LV.5
14
2015-01-23 20:33
@想飞的狼
不是的,两个半桥都是高频
站内短信联系你了,有事请较
0
回复
znzl
LV.3
15
2015-01-23 21:09
@想飞的狼
在公司不敢玩高压,爆了被老板看到就玩完了,直接用直流电源做H桥的输入,波形如下[图片]下管互补波形[图片]上管波形也测下,不过只能测一个管子的,上面两个管子不工地[图片]由于没有稳压和保护算法,整流后带载电压下降,并且波形畸变[图片][图片] 
高人
0
回复
2015-01-24 14:06
@xzszrs
非常不错,鼓励下,置顶!

 

稳压按照峰值采样,

采的峰值电压改变,你载波的每个周期占空比就改变,就改变你的输出电压,

我测过其中一段SPWM的波形,规律如下,

 导通14uS   截止28uS,     导通14uS    截止28uS,    导通15uS   截止27uS, 导通15uS    截止27uS,

 导通16uS   截止26uS,     导通16uS    截止26uS,    导通17uS   截止25uS, 导通17uS    截止25uS,

 导通18uS   截止24uS,     导通18uS    截止24uS,     导通19uS   截止23uS, 导通19uS    截止23uS,

  导通20uS   截止22uS,    导通20uS    截止22uS,   .........................................

 

也就是载波的每2个周期递增1uS, 到了占空比最大时,然后每2个周期递减1uS

 

 

 

 

 

0
回复
shinesz
LV.4
17
2015-01-24 21:18
STM8应该是够用了的,正弦表可以放在flash内,关键是稳压部分吧,EG8010稳压就做得挺好的
0
回复
2015-01-24 22:28
@水乡电源
 稳压按照峰值采样,采的峰值电压改变,你载波的每个周期占空比就改变,就改变你的输出电压,我测过其中一段SPWM的波形,规律如下, 导通14uS  截止28uS,    导通14uS   截止28uS,   导通15uS  截止27uS,导通15uS   截止27uS, 导通16uS  截止26uS,    导通16uS   截止26uS,   导通17uS  截止25uS,导通17uS   截止25uS, 导通18uS  截止24uS,    导通18uS   截止24uS,    导通19uS  截止23uS,导通19uS   截止23uS, 导通20uS  截止22uS,   导通20uS   截止22uS,  ......................................... 也就是载波的每2个周期递增1uS,到了占空比最大时,然后每2个周期递减1uS     

楼主是把50HZ分成多少等份(也就是采样多少点) ?

几个周期改变一次站空比?(几倍频)

 

0
回复
2015-01-25 08:35
@水乡电源
楼主是把50HZ分成多少等份(也就是采样多少点)?几个周期改变一次站空比?(几倍频) 
是的,把正弦波分成100个等分,4个定时周期改变一次,这样就是400个周期完成一次正弦波调制
0
回复
2015-01-25 08:39
@水乡电源
 稳压按照峰值采样,采的峰值电压改变,你载波的每个周期占空比就改变,就改变你的输出电压,我测过其中一段SPWM的波形,规律如下, 导通14uS  截止28uS,    导通14uS   截止28uS,   导通15uS  截止27uS,导通15uS   截止27uS, 导通16uS  截止26uS,    导通16uS   截止26uS,   导通17uS  截止25uS,导通17uS   截止25uS, 导通18uS  截止24uS,    导通18uS   截止24uS,    导通19uS  截止23uS,导通19uS   截止23uS, 导通20uS  截止22uS,   导通20uS   截止22uS,  ......................................... 也就是载波的每2个周期递增1uS,到了占空比最大时,然后每2个周期递减1uS     
工频是50HZ,载波是20k,所以400次完成一次正弦波输出,我把一个正弦波分成100等分放在ram里面,刚开始的时候计算好,你的说法是正确的,不过我的是双极性调制,每4个载波周期改变一次PWM输出
0
回复
2015-01-25 09:20
@shinesz
STM8应该是够用了的,正弦表可以放在flash内,关键是稳压部分吧,EG8010稳压就做得挺好的
任何PWM的单片机都可以产生正弦波输出的,但是要做好稳压是不容易的
0
回复
ssff
LV.5
22
2015-01-25 15:42
@shinesz
STM8应该是够用了的,正弦表可以放在flash内,关键是稳压部分吧,EG8010稳压就做得挺好的

听大神说过,EG8010的动态稳压范围不好,牺牲动态稳压精度,来保证静态的稳压。正弦波稳压好像都是这样,不知道楼主可以打破这个局限不?

0
回复
ssff
LV.5
23
2015-01-25 15:44
@想飞的狼
是的,把正弦波分成100个等分,4个定时周期改变一次,这样就是400个周期完成一次正弦波调制
兄台,可以做个电压前馈方式,引入母线高压反馈,这样应该会最快,加上后端的交流采样,2者合成,估计稳压好做了。
0
回复
ssff
LV.5
24
2015-01-25 15:48
@世纪逆变
任何PWM的单片机都可以产生正弦波输出的,但是要做好稳压是不容易的[图片]
,确实,做正弦波的芯片太多了,已经一点都不神秘了。
0
回复
2015-01-25 18:17
@ssff
听大神说过,EG8010的动态稳压范围不好,牺牲动态稳压精度,来保证静态的稳压。正弦波稳压好像都是这样,不知道楼主可以打破这个局限不?
还没想过,因为不是本行,玩玩还行,如果要我做的话就采样输出电压,改变乘法因子,其中算法可以使用开关  滞环做,不过有一定稳定误差
0
回复
2015-01-25 21:38
@想飞的狼
还没想过,因为不是本行,玩玩还行,如果要我做的话就采样输出电压,改变乘法因子,其中算法可以使用开关 滞环做,不过有一定稳定误差

 

楼主分成100等份,4个周期改变一次占空比,这样你的谐波大,正弦波也不好看,稳压性能也不会好,

至少要200等份,最多2个周期改变一次占空比,

等份越多,输出的正弦越好看,稳压效果越好,

 

采样输出的正弦波,电阻分压后单片机A/D检测,控制载波的脉冲占空比,呈反比例线性变化,达到稳压目的,

 

每个周期改变占空比是最好的,纯硬件做的SPWM,每个周期占空比都会改变,所以纯硬件的动态稳压效果很好,

8010的稳压效果好,波形也漂亮,

8010是50HZ采样234点,每2个周期改变一次占空比,载波23.4K,50*234*2=23.4K

8010是60HZ采样195点,每2个周期改变一次占空比,载波23.4K,所以老寿那个大IGBT驱动板,12M晶振换成10M晶振,

接成60HZ形式输出50HZ,载波是19.5K的原因就是195点,60*195*2=23.4K,50*195*2=19.5K

0
回复
35956911
LV.8
27
2015-01-25 22:03
@水乡电源
 楼主分成100等份,4个周期改变一次占空比,这样你的谐波大,正弦波也不好看,稳压性能也不会好,至少要200等份,最多2个周期改变一次占空比,等份越多,输出的正弦越好看,稳压效果越好, 采样输出的正弦波,电阻分压后单片机A/D检测,控制载波的脉冲占空比,呈反比例线性变化,达到稳压目的, 每个周期改变占空比是最好的,纯硬件做的SPWM,每个周期占空比都会改变,所以纯硬件的动态稳压效果很好,8010的稳压效果好,波形也漂亮,8010是50HZ采样234点,每2个周期改变一次占空比,载波23.4K,50*234*2=23.4K8010是60HZ采样195点,每2个周期改变一次占空比,载波23.4K,所以老寿那个大IGBT驱动板,12M晶振换成10M晶振,接成60HZ形式输出50HZ,载波是19.5K的原因就是195点,60*195*2=23.4K,50*195*2=19.5K
你会C语言不,帮我改个收音机程序
0
回复
2015-01-26 10:20
@水乡电源
 楼主分成100等份,4个周期改变一次占空比,这样你的谐波大,正弦波也不好看,稳压性能也不会好,至少要200等份,最多2个周期改变一次占空比,等份越多,输出的正弦越好看,稳压效果越好, 采样输出的正弦波,电阻分压后单片机A/D检测,控制载波的脉冲占空比,呈反比例线性变化,达到稳压目的, 每个周期改变占空比是最好的,纯硬件做的SPWM,每个周期占空比都会改变,所以纯硬件的动态稳压效果很好,8010的稳压效果好,波形也漂亮,8010是50HZ采样234点,每2个周期改变一次占空比,载波23.4K,50*234*2=23.4K8010是60HZ采样195点,每2个周期改变一次占空比,载波23.4K,所以老寿那个大IGBT驱动板,12M晶振换成10M晶振,接成60HZ形式输出50HZ,载波是19.5K的原因就是195点,60*195*2=23.4K,50*195*2=19.5K
我只是试试,本身我不做逆变器的,从单片机资源上来说,没什么问题
0
回复
2015-01-26 10:21
@35956911
你会C语言不,帮我改个收音机程序
不敢说精通,但是没做过收音机,建议找专门做收音机的搞
0
回复
2015-01-26 10:25
帖子非常不错,推荐到帖子底部经典图库。更多请点击哦:http://www.dianyuan.com/bbs/classic/
0
回复
HL_ZXM
LV.4
31
2015-01-27 16:26
@想飞的狼
我只是试试,本身我不做逆变器的,从单片机资源上来说,没什么问题

呵呵!5mha?大啊,当做2KW时就是10A220V的铜丝,可能有2,3个变压器那样打了-------成本就不低

以前做过这样的板,0.5mh,1.2元/片16脚的合泰单片机。

0
回复