afei8856 发表于 2012-5-4 15:51:53

有关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;
}

yyande 发表于 2012-5-4 20:38:59

pwm+=0x1998;
pwm-=0x1998;
应该是这两句需要修改!

yyande 发表于 2012-5-4 20:53:25

哦,我答错了!根据F330的手册,PWM的输出频率应该是(PCA时基/65536),应该F320也一样!

yyande 发表于 2012-5-4 21:13:20

PCA0MD    = 0x09;
PCA使用系统时钟,PCA溢出中断允许
CLK=12000000/65536=183HZ
使用8位PWM的话
CLK=12000000/256=46875HZ
建议PCA0MD=5;选用Timer0溢出当PCA的时钟,
将Timer0的溢出周期调整为0.256MHZ,将PCA选为8位PWM模式,

AdmTimer 发表于 2012-5-4 21:44:19

pca本身是一个16位计数器,决定了频率,捕捉比较模块是另一个寄存器,决定了占空比。看过手册基本就能明白了,c8051的datasheet应该是我见过最规范的。
怀疑楼主的程序是copy来的{:lol:}

hamipeter 发表于 2012-5-5 00:46:46

AdmTimer 发表于 2012-5-4 21:44 static/image/common/back.gif
pca本身是一个16位计数器,决定了频率,捕捉比较模块是另一个寄存器,决定了占空比。看过手册基本就能明白 ...

我也觉得是哦,

afei8856 发表于 2012-5-5 08:53:09

这确实是copy过来的程序,现在只是像用他带的PWM用一下, 做一下测试,就稍微修改了改。4楼说的有道理 ,昨天下午下班前已经改成8位了。并且测试通过,多谢yyande 的回答啊!

chenjiawei7 发表于 2012-12-16 16:36:34

我用的310的片子,但是PWM波形的上升沿一点都不陡峭,不知道怎么回事,我没有用中断写的
页: [1]
查看完整版本: 有关C8051f320中PWM使用的问题?