数码之家

 找回密码
 立即注册
搜索
查看: 749|回复: 5

[C51] 正玄波代码求助 stc8g单片机写的程序输出spwm波到变压器后不是正玄波

[复制链接]
发表于 2023-11-23 13:29:17 来自手机浏览器 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sls2078327 于 2023-11-23 17:34 编辑

stc8g单片机写的程序输出spwm波到变压器后不是正玄波,高手帮忙看看哪里不对   正玄波代码如下
#include <stc8g.h>

#define uchar unsigned char
#define uint unsigned int
#define jiezhi 0xff;

void delay(uint k) ;
void ADC_Init(void);
void PWM_Init(void);
void Timer0_Init(void);

sbit AD = P5^4;//ADC4电压采集
sbit DCIdentification = P5^5; //24v/12v电压识别  高电平为24V  低电平为12V
sbit xiaqiao1 = P3^1;//PWM1下桥臂1输出
sbit xiaqiao0 = P3^0;//PWM0下桥臂0输出

uchar num1=0xff; //根据采集到的电压去调节PWM输出的占空比
uchar num0=0xff;
uint vin;

//PIN5.5 INT3
//下载程序时  调节工作频率8MHz  = 高频臂31KHZ  低频臂50HZ

void main()
{
        ADC_Init();
  PWM_Init();
        Timer0_Init();
        
        P3M0 = 0x00;         //P3口为准双向模式00000000;
        P3M1 = 0x00;
        P5M0 = 0x00;  //P5.4端口设置为高阻模式
        P5M1 = 0x10;
        IP|=0x20;        //ADC中断优先级最高
        IPH|=0x20;//ADC中断优先级最高
//        INTCLKO = 0x20;
  
        //7位PWM 占空比为 75%[(80H-20H)/80H]=(128-32)/128=0.75
          //6位PWM 占空比为 50%[(40H-20H)/40H]=(64-32)/64=0.5
        //8位PWM 占空比为 87.5%[(100H-20H)/100H]=(256-32)/256=0.875
        //10位PWM 占空比为 87.5%[(400H-20H)/400H]=(1024-32)/1024=0.9675
               
        while (1);
}
void ADC_Init(void)
{
        P_SW2 |= 0x80;
        ADCTIM = 0x3a;                 //设置 ADC 内部时序
        P_SW2 &= 0x7f;
        ADCCFG = 0x28;    //设置ADC工作频率 系统时钟/2/16分频
        ADC_CONTR=0x84;          //使能ADC4模块
        EADC = 1;                                  //使能 ADC 中断
        delay(2);
        ADC_CONTR |= 0x40; //开始转换
        delay(2);
}
//基准5V  10位精度=5/1024=0.0048828125
//12V过压为14V,欠压为10V。  24V过压为28V,欠压为20V。
void ADC_Isr() interrupt 5
{
        uint vin;
        ADC_CONTR &= ~0x20; //清中断标志
        vin = ADC_RES; //读取 ADC 结果
        vin <<= 8;
        vin |= ADC_RESL;
        ADC_CONTR |= 0x40; //继续 AD 转换
        
        //12V输入过欠压保护 上分压10K下分压1K

  if(DCIdentification==0)
        {
                if(vin<=186||vin>=260)
                {                                
                        CR=0;
                        TR0=0;
                }
        }               
                else
                {
                        CR=1;
                        TR0=1;
                }

        //24V输入过欠压保护
        if(DCIdentification==1)
        {
                if(vin<=372||vin>=521)
                {
                        TR0=0;
                        CR=0;
                }
        }
                 else
                {
                        CR=1;
                        TR0=1;
                }
}

void PWM_Init(void)
{
        CCON = 0x00;
        CMOD=0x08;                //
        CCAPM1=0x63;  //PWM上升沿中断  P3.3
        PCA_PWM1=0x00; //7位PWM 0x40 频率系统时钟/128  0x00=8位=时钟/256 0x80=6位=时钟/64  0xc0=10位=时钟/1024
        CCAPM0=0x63;  //PWM上升沿中断         P3.2
        PCA_PWM0=0x00;
        CR=1;

}
void PCA_Isr() interrupt 7
{
        CCF0 = 0;
        CCAP1L = num1;
        CCAP1H = num1;
        CCAP0L = num0;
        CCAP0H = num0;
}


void Timer0_Init(void)                //8MHz   19.5微秒  
{
        AUXR |= 0x80;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x66;                                //设置定时初始值
        TH0 = 0xff;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        ET0 = 1;
        EA = 1;     //开启总中断
        TR0 = 1;                                //定时器0开始计时
}

void TM0_Isr() interrupt 1
{
        uint i;
        i++;
        if(i>=0&&i<242)
        {
                        num1--;
                xiaqiao1=1;
        }
        if(i>=242&&i<483)
        {
                        num1++;
        }
        if(i>=483&&i<512)         //a死区时间0.0000195*30=0.0006秒 也就是占空比3%
        {
                        num1=jiezhi;
                  xiaqiao1=0;
        }
        if(i>=512&&i<754)
        {
                num0--;
                xiaqiao0=1;
        }
        if(i>=754&&i<995)
        {
                num0++;
        }
        if(i>=995&&i<1023)  
        {
                num0=jiezhi;
                xiaqiao0=0;
        }
        if(i==1023)                  //b死区时间0.0000195*30=0.0006秒 也就是占空比3%
        {
                i=0;
        }
}

void delay(uint k)   //延时函数
{
        uint i,j;
        for(i=0;i<k;i++)
        {
                for(j=0;j<79;j++);
        }
}
IMG_20231123_132035.jpg
IMG_20231123_132022.jpg
IMG_20231123_172110.jpg
发表于 2023-11-23 16:29:45 | 显示全部楼层
要加LC滤波后才变成近似正弦波。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-23 17:28:42 来自手机浏览器 | 显示全部楼层
mmxx2015 发表于 2023-11-23 16:29
要加LC滤波后才变成近似正弦波。

加在变压器前边,还是加在单片机输出端?我试了加在变压器前边空载输出的是这种波形
回复 支持 反对

使用道具 举报

发表于 2023-11-23 19:09:39 | 显示全部楼层
功率电路是怎么连接的?另外高频变压器不能用来直接升压SPWM波.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-23 23:58:49 来自手机浏览器 | 显示全部楼层
简燕 发表于 2023-11-23 19:09
功率电路是怎么连接的?另外高频变压器不能用来直接升压SPWM波.

可能是我的功率放大电路问题。我是直接用控制电机正反转的h桥电路驱动工频变压器,也能输出电压,只不过波形不对,输出AC电压也只有100伏左右
回复 支持 反对

使用道具 举报

发表于 2023-12-7 23:31:50 | 显示全部楼层
看示波器输出的是spwm,只是你接的是mos管那端吧。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-13 16:35 , Processed in 0.296401 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表