问题:用以下程序产生占空比可变的pwm波,预期的是能够在示波器上观察到占空比变化的波形即每周期的占空比不同,但是实际观察到的波形却是某一时刻的占空比,但占空比是整体发生变化。请大神指点。。。。。。。。
#include"c8051f020.h"
#include "math.h"
#define PI 3.14
sbit SPWM_OUT1=P0^4;
signed char i_SPWM1;
unsigned int f=50;
unsigned int N; //载波比
unsigned int xdata s_L[] ;
unsigned int k ;
double M=0.8 ;
void SysclkInit(void)
{
OSCICN=0x86; //设置SYSCLK为8MHz内部振荡器
}
void PortInit(void)
{
XBR0=0x1d; //使CEX0和CEX1输出到P0.0、P0.1
XBR1=0x14; //外部中断0端脚来测频率,外部中断1端脚来测相位差
XBR2=0x40; //允许交叉开关和弱上拉
P0MDOUT=0xff; //端口引脚输出方式为推挽
}
void PCA0Init(void)
{
PCA0MD=0x01; //设置空闲等待方式,PCA时基=SYSCLK/12
//允许CF中断
PCA0CPM0=0x42; //PCA输出方式选择,8位pwm
}
void main()
{
SysclkInit();
PortInit();
WDTCN = 0xde; //禁止看门狗定时器
WDTCN = 0xad;
PCA0Init();
i_SPWM1=0;
N=1000000/(f*384);
for(k=0;k<N;k++)
{
s_L[k]=256*(0.5-0.5*M*sin((2*k+1)*PI/N)); //产生低电平的宽度}
EIP1=0x08;
EIE1|=0x08; //允许PCA中断
EA=1;
PCA0CPL0=s_L[0];
PCA0CN=0x40; //允许PCA计数 ;
while(1)
{
}
}
void PCA_ISR(void) interrupt 9
{
//CCF0:PCA0 模块0 捕捉/比较标志在发生一次匹配或捕捉时该位由硬件置位。当CCF 中断被允许时,该位置‘1’
//将导致CPU 转向CCF 中断服务程序。该位不能由硬件自动清0,必须用软件清0
CF=0;
i_SPWM1++;
if(i_SPWM1==N)
{
i_SPWM1=0;
PCA0CPH0=s_L[i_SPWM1];
}
else{
PCA0CPH0=s_L[i_SPWM1];
}
}
此帖出自
小平头技术问答
楼主观察到的波形是不是固定位置的方波,然后一个边沿扫描式的移动?
试一试改变步长,让占空比变化的剧烈一些,然后观察相邻的方波有没有不同
一周热门 更多>