|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
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++);
}
} |
|