有关C8051f320中PWM使用的问题?
使用PCA,16位的PWM模式,当key0按下时,增加脉宽,当key1按下时,减小脉宽。PCA输出到P1.2脚,现在的情况是可以有输出,而且正好按下10次后复原。但是现在想在此基础上改变输出频率,最好能固定在1kHz左右?这款芯片如何修改PWM的输出频率?#include <c8051f320.h>
#define uchar unsigned char
#define uint unsigned int
void port_init (void);
void pca_init (void);
sbit key0= P2^0; //定义按键0
sbit key1= P2^1; //定义按键1
sbit led0= P2^2; //定义LED0
sbit led1= P2^3; //定义LED1
bit pca_flag;
uint pwm=0;
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=113;j>0;j--);
}
void main (void)
{
PCA0MD &= ~0x40; //关闭看门狗
OSCICN |= 0x83; //使用内部12M晶振
led0=0;
led1=0;
port_init (); //端口初始化
pca_init (); //PCA初始设为16位脉宽
EA=1;
while (1)
{
if( key0==0)
{
delay(10);
if(key0==0)
{
while(!key0);
pca_flag=0;
EIE1= 0x10;
led0=1;
}
}
if(key1==0)
{delay(10);
if(key1==0)
{
while(!key1);
pca_flag=1;
led0=0;
EIE1= 0x10;
}
}
}
}
/******************************************************************
端口初始化程序
******************************************************************/
void port_init (void)
{P0SKIP = 0xff; //跳过P0口
P1SKIP = 0x03; //跳过P1.2
XBR1 = 0x42; //将PCA输出配置到P1.2脚
P1MDOUT |= 0x04; //P1.2配置为推挽输出
P2MDOUT |= 0x0c; // 使能P2.2,P2.3为推挽输出
}
/******************************************************************
初始化PCA的CEX0输出16位PWM信号
******************************************************************/
void pca_init (void)
{
PCA0CN = 0x40; //PCA定时器使能
PCA0CPM0= 0xc2; //使能16位PWM
PCA0MD = 0x09; //PCA定时器溢出中断允许
PCA0CPH0 = 0xeb;
// EIE1= 0x10; //允许PCA中断
//pca_flag=0;
}
/******************************************************************
PCA中断处理程序
******************************************************************/
void pca_isr (void) interrupt 11
{
if(pca_flag==0)
{
PCA0CPL0=(0xff&pwm);
PCA0CPH0=(0xff&(pwm>>8));
pwm+=0x1998;
EIE1= 0x00;
//if(pwm==0xfff9){pca_flag=1;}
}
if(pca_flag==1)
{
PCA0CPL0=(0xff&pwm);
PCA0CPH0=(0xff&pwm>>8);
pwm-=0x1998;
EIE1= 0x00;
//if(pwm==0){pca_flag=0;}
}
CF = 0;
}
pwm+=0x1998;
pwm-=0x1998;
应该是这两句需要修改! 哦,我答错了!根据F330的手册,PWM的输出频率应该是(PCA时基/65536),应该F320也一样! PCA0MD = 0x09;
PCA使用系统时钟,PCA溢出中断允许
CLK=12000000/65536=183HZ
使用8位PWM的话
CLK=12000000/256=46875HZ
建议PCA0MD=5;选用Timer0溢出当PCA的时钟,
将Timer0的溢出周期调整为0.256MHZ,将PCA选为8位PWM模式, pca本身是一个16位计数器,决定了频率,捕捉比较模块是另一个寄存器,决定了占空比。看过手册基本就能明白了,c8051的datasheet应该是我见过最规范的。
怀疑楼主的程序是copy来的{:lol:} AdmTimer 发表于 2012-5-4 21:44 static/image/common/back.gif
pca本身是一个16位计数器,决定了频率,捕捉比较模块是另一个寄存器,决定了占空比。看过手册基本就能明白 ...
我也觉得是哦, 这确实是copy过来的程序,现在只是像用他带的PWM用一下, 做一下测试,就稍微修改了改。4楼说的有道理 ,昨天下午下班前已经改成8位了。并且测试通过,多谢yyande 的回答啊! 我用的310的片子,但是PWM波形的上升沿一点都不陡峭,不知道怎么回事,我没有用中断写的
页:
[1]