怎么让单片机(c8051f340)产生一定占空比的pwm波形

/******************************************************************本程序为PCA16位PWM输出例程,... /******************************************************************
本程序为PCA16位PWM输出例程,jp2第2脚为PWM输出
******************************************************************/

#include <c8051f340.h>
#define uchar unsigned char
#define uint unsigned int

void port_init (void);
void pca_init (void);

bit pca_flag;
uint pwm=0;
void main (void)
{
PCA0MD &= ~0x40; //关闭看门狗
OSCICN |= 0x03; //使用内部12M晶振
port_init (); //端口初始化
pca_init (); //PCA初始设为16位脉宽
EA=1;

while (1)
{

}
}
/******************************************************************
端口初始化程序
******************************************************************/
void port_init (void)
{ P0SKIP = 0xff; //跳过P0口
P1SKIP = 0x03; //跳过P1.1
XBR1 = 0x42; //将PCA输出配置到P1.2脚
P1MDOUT |= 0x04; //P1.2配置为推挽输出
}
/******************************************************************
初始化PCA的CEX0输出16位PWM信号
******************************************************************/
void pca_init (void)
{
PCA0CN = 0x40; //PCA定时器使能
PCA0CPM0 = 0xc2; //使能16位PWM
PCA0MD = 0x01; //PCA定时器溢出中断允许
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+=0x0050;
if(pwm==0xfff0){pca_flag=1;}
}
if(pca_flag==1)
{
PCA0CPL0=(0xff&pwm);
PCA0CPH0=(0xff&pwm>>8);
pwm-=0x0050;
if(pwm==0){pca_flag=0;}
}
CF = 0;
}
最后一段怎么改 比如占空比是60%
展开
 我来答
电子哥的日常
2021-02-13
知道答主
回答量:73
采纳率:0%
帮助的人:3.5万
展开全部

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
艾普斯
2024-07-18 广告
稳频稳压电源哪家好?艾普斯电源(苏州)有限公司开始专业研发、制造及营销交流稳压电源,满足全球电子及信息业对电源设备日益蓬勃的市场需求。迄今为止,业已发展成为交流不间断电源、稳压电源、变频电源、中频航空- 军事专用电源、直流电源、逆变电源等产... 点击进入详情页
本回答由艾普斯提供
藏在水中的人
2012-04-09 · TA获得超过990个赞
知道小有建树答主
回答量:474
采纳率:0%
帮助的人:568万
展开全部
在这个程序中 占空比=(65536-pwm)/65536
要让占空比为60% pwm=65536-65536*0.6=26214;
只要下面程序 就可以产生PWM了不需要中断的
void PCA0_Init (void)
{
unsigned int CEX0_Compare_Value ;
PCA0CN = 0x00; // Stop counter; clear all flags
PCA0MD = 0x08; // Use SYSCLK as time base
PCA0CPM0 = 0xC2; // Module 0 = 16-bit PWM mode and
// Configure initial PWM duty cycle = 60%
CEX0_Compare_Value = 65536 - (65536 * 0.6);
PCA0CPL0 = (CEX0_Compare_Value & 0x00FF);
PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8;
CR = 1;
}
追问
谢谢,是不是就是把PCA0CPL0和PCA0CPH0设定某个值就行了啊。我还想问个问题,我现在需要这个PWM波形是20KHZ左右的,要再哪里改程序设定啊,是不是用到分频什么的,怎么会越改越小了~~
追答
20KHZ~~~~只能用8位PWM,晶振12M ,PWM分频系数=12M/256/20K=2.3475取2分频,
得PWM频率=12M/2/256=23437.5HZ
选择d定时器0溢出作为PCA时钟源。
用下面程序初始化PCA
{
PCA0MD=0x04;
TMOD |= 0x02; //TIMER1自动重装载8位定时器
CKCON |= 0X08;
TH0 = -2;
TR0=1; //定时器0允许运行
PCA0CPM0=0x42;
PCA0CPL0=256-256*0.4;
PCA0CPH0=256-256*0.4;
CR=1;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式