怎么让单片机(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% 展开
本程序为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% 展开
2个回答
艾普斯
2024-07-18 广告
2024-07-18 广告
稳频稳压电源哪家好?艾普斯电源(苏州)有限公司开始专业研发、制造及营销交流稳压电源,满足全球电子及信息业对电源设备日益蓬勃的市场需求。迄今为止,业已发展成为交流不间断电源、稳压电源、变频电源、中频航空- 军事专用电源、直流电源、逆变电源等产...
点击进入详情页
本回答由艾普斯提供
展开全部
在这个程序中 占空比=(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;
}
要让占空比为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;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询