/******************************************PFC886+互补6pwm*******************************************/
/******************************************QQ:774145445**********************************************/
/******************************************快手:共同学习STM8*****************************************/
/****************************************************************************************************/
// __________@__________
// PWM2L-|1 pa2 pa1 20|-PWM2H
// PWM1L-|2 pa3 pa0 19|-PWM1H
// pwm0L-|3 pa4 pa7 18|-pwm0H
// |4 pa5 pa6 17|
// |5 nc nc 16|
// |6 gnd vdd 15|
// k1-|7 pb0 pb7 14|
// k2-|8 pb1 pb6 13|
// k3-|9 pb2 pb5 12|
// k4-|10_pb3_________pb4_11|
#include "extern.h"
k1 bit pb.0;
k2 bit pb.1
k3 bit pb.2
k4 bit pb.3
/****************************************************************************************************/
void zhengxian(); //正弦
void yanshi(); //延时
/****************************************************************************************************/
word a1,b1,c1; //abc相
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/4 // SYSCLK=IHRC/4
/****************************************************************************************************/
pmode 31; ///8/8/8/8/8/8/8/8带宽共享
fppen = 0xFF; //8核全开
//有8个核心可以分时全部运行,可以分别干8件事8核真爽!
/****************************************************************************************************/
$ k1 in,pull; //输入上拉电阻
$ k2 in,pull;
$ k3 in,pull;
$ k4 in,pull;
/****************************************************************************************************/
//$ pwmgc enable,updown,reset;
//$ pwmgm protection_enable,ihrc,/16;
pwmgc =0b1_0_1_1_0000; //PWMG控制寄存器
//7,停用启用6,输出状态5,中心排列模式4,PWM计数器清零
//pwmgm =0b0_0_1_0_10_10; //PWMG分频寄存器
pwmgm =0b0_0_1_0_10_11; //PWMG分频寄存器
//7,上臂反极性6,下臂反极性5,臂保护4,臂保护模式32,PWM时钟源10,PWM分频
pwmgc1 =0b1_11_0_01_10; //PWMG控制寄存器1
//7,互补发生器65,三相电机4,读零32,PWM5.PWM+|10,PWM4.PWM-
pwmgc2 =0b01_10_01_10; //PWMG控制寄存器2
//76,PWM3.PWM+|54,PWM2.PWM-|32,PWM1.PWM+|10,PWM0.PWM-
pwmcubl =0b1111_0000; //pwm上限寄存器l
pwmcubh =0b1111_1111; //pwm上限寄存器h
//pwmdz =0b1111_0000; //死区寄存器
pwmdz =0b1000_0000; //死区寄存器//*注意死区占上臂时间需要扣除
//pwm0dtl =0b1111_0000; //pwm0占空比低位寄存器//先写低位
//pwm0dth =0b1111_1111; //pwm0占空比高位寄存器
//pwm1dtl =0b0000_0000; //pwm1占空比低位寄存器//先写低位
//pwm1dth =0b1000_0000; //pwm1占空比高位寄存器
//pwm2dtl =0b1111_0000; //pwm2占空比低位寄存器//先写低位
//pwm2dth =0b0000_0000; //pwm2占空比高位寄存器
/****************************************************************************************************/
while (1)
{
//.delay 400000;
//anjian();
}
}
/****************************************************************************************************/
void FPPA1 (void)
{
a1 =0x0f;
b1 =0x0f;
c1 =0x0f;
pwm0dtl =0;
//pwm0dth =a1;
pwm1dtl =0;
pwm1dth =b1;
pwm2dtl =0;
pwm2dth =c1;
while (1)
{
zhengxian();
}
}
/****************************************************************************************************/
void FPPA2 (void)
{
goto $;
}
/****************************************************************************************************/
void FPPA3 (void)
{
goto $;
}
/****************************************************************************************************/
void FPPA4 (void)
{
goto $;
}
/****************************************************************************************************/
void FPPA5 (void)
{
goto $;
}
/****************************************************************************************************/
void FPPA6 (void)
{
goto $;
}
/****************************************************************************************************/
void FPPA7 (void)
{
goto $;
}
/****************************************************************************************************/
/*
void Interrupt (void)
{
pushaf;
if (Intrq.T16)
{ // T16 Trig
// User can add code
Intrq.T16 = 0;
//...
}
popaf;
}
*/
/****************************************************************************************************/
void zhengxian() //正弦
{
bit zx_a1,zx_b1,zx_c1; //状态机0减小1增大
a1 =0x0f; //a相
b1 =0xaaaf; //b相
c1 =0xaaaf; //c相
zx_a1 =1; //增大
zx_b1 =1; //增大
zx_c1 =0; //减小
while(1)
{
if(zx_a1) //a相增大
{
pwm0dtl =a1 $0;
pwm0dth =a1 $1;
a1 +=0x1f;
if(a1>0xf700){zx_a1=0;} //a相变减小*注意减去死区时间
}
if(!zx_a1) //a相减小
{
pwm0dtl =a1 $0;
pwm0dth =a1 $1;
a1 -=0x1f;
if(a1<0x00ff){zx_a1=1;} //a相变增大0x001f0x00ff
}
if(zx_b1) //b相增大
{
pwm1dtl =b1 $0;
pwm1dth =b1 $1;
b1 +=0x1f;
if(b1>0xf700){zx_b1=0;} //b相变减小
}
if(!zx_b1) //b相减小
{
pwm1dtl =b1 $0;
pwm1dth =b1 $1;
b1 -=0x1f;
if(b1<0x00ff){zx_b1=1;} //b相变增大
}
if(zx_c1) //c相增大
{
pwm2dtl =c1 $0;
pwm2dth =c1 $1;
c1 +=0x1f;
if(c1>0xf700){zx_c1=0;} //c相变减小
}
if(!zx_c1) //c相减小
{
pwm2dtl =c1 $0;
pwm2dth =c1 $1;
c1 -=0x1f;
if(c1<0x00ff){zx_c1=1;} //c相变增大
}
yanshi();
}
}
/****************************************************************************************************/
void yanshi() //延时
{
.delay 6000;
/*if(k1)
{
nop;
nop;
while(k1){.delay 100;} //定在这
while(!k1){.delay 100;} //等待松手
}*/
}
/****************************************************************************************************/
/****************************************************************************************************/
/****************************************************************************************************/
/****************************************************************************************************/
/****************************************************************************************************/
|