1. stc12c5a60s2单片机pwm占空比控制寄存器怎么调
CCAP0H=0x80; // 占空比控制,数字范围0-255,数字越大,占空比越小,
CCAP0L=0x80; // 自动重装,所以CCAP0H,CCAP0L相等
PCA_PWM0=0x00; //stc12c5a60s2是8位PWM,控制占空比的第九位为0
2. 怎么用stc12c5a60s2单片机写PWM的程序,哪位大侠提供详细例程的
#include <REG51.H>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
void DelayMs(U8 ms);
void PWM_clock(U8 clock);
void PWM_start(U8 mole,U8 mode);
////////////////////// 延时子程序/////////////////////////////
void DelayMs(U8 ms) //在11.0592M晶振下,stc10f系列(单周期指令)的ms级延时
{
U16 i;
while(ms--)
{
for(i = 0; i < 850; i++);
}
}
////////////////////主函数入口////////////////////////////
sfr CCON = 0xD8; //PCA控制寄存器
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CCAPM0 = 0xDA; //PCA模块0模式寄存器 //模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)
sfr CCAPM1 = 0xDB; //PCA模块1模式寄存器 //模块1对应P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列)
sfr CL = 0xE9; //PCA 定时寄存器 低位
sfr CH = 0xF9; //PCA 定时寄存器 高位
sfr CCAP0L = 0xEA; //PCA模块0的 捕获寄存器 低位
sfr CCAP0H = 0xFA; //PCA模块0的 捕获寄存器 高位
sfr CCAP1L = 0xEB; //PCA模块1的 捕获寄存器 低位
sfr CCAP1H = 0xFB; //PCA模块1的 捕获寄存器 高位
sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0
sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1
sbit CF = 0xDF; //PCA计数溢出标志位
sbit CR = 0xDE; //PCA计数器 运行控制位
sbit CCF1 = 0xD9; //PCA模块1中断标志
sbit CCF0 = 0xD8; //PCA模块0中断标志
//* CCAPOH = CCAPOL = 0XC0; //模块0输出 占空因数为25%
//* CCAPOH = CCAPOL = 0X80; //模块0输出 占空因数为50%
//* CCAPOH = CCAPOL = 0X40; //模块0输出 占空因数为75%
void PWM_clock(U8 clock);
void PWM_start(U8 mole,U8 mode);
void PWM_clock(U8 clock)
{
CMOD |= (clock<<1);
CL = 0x00;
CH = 0x00;
}
void PWM_start(U8 mole,U8 mode)
{
CCAP0L = 0XE0;
CCAP0H = 0XE0; //模块0初始输出 占空因数为75%
CCAP1L = 0XE4;
CCAP1H = 0XE4; //模块1初始输出 占空因数为25%
if(mole==0)
{
switch(mode)
{
case 0: CCAPM0 = 0X42;break; //模块0设置为8位PWM输出,无中断
case 1: CCAPM0 = 0X53;break; //模块0设置为8位PWM输出,下降沿产生中断
case 2: CCAPM0 = 0X63;break; //模块0设置为8位PWM输出,上升沿产生中断
case 3: CCAPM0 = 0X73;break; //模块0设置为8位PWM输出,跳变沿产生中断
default: break;
}
}
else
if(mole==1)
{
switch(mode)
{
case 0: CCAPM1 = 0X42;break; //模块1设置为8位PWM输出,无中断
case 1: CCAPM1 = 0X53;break; //模块1设置为8位PWM输出,下降沿产生中断
case 2: CCAPM1 = 0X63;break; //模块1设置为8位PWM输出,上升沿产生中断
case 3: CCAPM1 = 0X73;break; //模块1设置为8位PWM输出,跳变沿产生中断
default: break;
}
}
else
if(mole==2)
{
switch(mode)
{
case 0: CCAPM0 = CCAPM1 = 0X42;break; //模块0和1设置为8位PWM输出,无中断
case 1: CCAPM0 = CCAPM1 = 0X53;break; //模块0和1设置为8位PWM输出,下降沿产生中断
case 2: CCAPM0 = CCAPM1 = 0X63;break; //模块0和1设置为8位PWM输出,上升沿产生中断
case 3: CCAPM0 = CCAPM1 = 0X73;break; //模块0和1设置为8位PWM输出,跳变沿产生中断
default: break;
}
}
CR=1; //PCA计数器开始计数
}
void PCA_Intrrpt(void) interrupt 7
{
if(CCF0) CCF0=0;
if(CCF1) CCF1=0; //软件清零
if(CF) CF=0; //软件清零
}
void main()
{
TMOD|=0x02; /* timer 0 mode 2: 8-Bit reload */
TH0=0xAF;
TR0=1;
PWM_clock(2); // PCA/PWM时钟源为 定时器0的溢出
PWM_start(0,0); // 模块0,设置为PWM输出,无中断,初始占空因素为25%
while(1)
{
DelayMs(250);
}
}
3. 跪求stc12c5a60s2单片机PWM程序。50%占空比。P1.3口输出PWM。
#include<STC12C5A60S2.H> //头文件
/*********************************************************************************************
函数名:PWM初始化函数
调 用:PWM_init();
参 数:无
返回值:无
结 果:将PCA初始化为PWM模式,初始占空比为0
备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可
/**********************************************************************************************/
void PWM_init (void){
CMOD=0x02; //设置PCA定时器
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
CCAP0H=0x00; // PWM0初始时为0
//CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//)
//CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
//CCAP1H=0x00; // PWM1初始时为0
//CCAPM2=0x42; //PWM2设置PCA工作方式为PWM方式
//CCAP2L=0x00; //设置PWM2初始值与CCAP0H相同
//CCAP2H=0x00; // PWM2初始时为0
//CCAPM3=0x42; //PWM3设置PCA工作方式为PWM方式
//CCAP3L=0x00; //设置PWM3初始值与CCAP0H相同
//CCAP3H=0x00; // PWM3初始时为0
CR=1; //启动PCA定时器
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:PWM0占空比设置函数
调 用:PWM0_set();
参 数:0x00~0xFF(亦可用0~255)
返回值:无
结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
/**********************************************************************************************/
void PWM0_set (unsigned char a){
CCAP0L= a; //设置值直接写入CCAP0L
CCAP0H= a; //设置值直接写入CCAP0H
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
/**********************************************************************************************/
void main (void){
while(1){
PWM_init(); //PWM初始化
PWM0_set(0x7F); //设置PWM占空比,总共255,除以2,转换成十六进制得7F
}
}
/**********************************************************************************************/
4. stc12c5A60s2单片机pwm输出怎么写,两路的 CCAPM0=0x42这是P1.3口的,
P1.4是模块1来控制的,初始化后给CCAPM1赋值就可以。
5. STC12C5A60S2单片机怎么才能输出占空比可调的PWM
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约23.4Khz
//CMOD=0x00; //设置PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约3.9Khz
//CMOD=0x04; //设置PCA定时器,计数频率为定时器0的溢出率,晶振频率/256 当为12Mhz时,PWM输出频率约183hz
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
void PWM1_set (uchar a)//PWM1占空比设置函数
{
CCAP1L=a; //设置值直接写入CCAP1L
CCAP1H=a; //设置值直接写入CCAP1H
}
主程序中,按预想规律改变PWM1_set (uchar a)的参数即可调节占空比
6. 跪求 STC12C5A60S2单片机内部PWM 程序
void pwm_init(void) //PWM初始化函数,初始占空比为0
{
CMOD=0x02; //0000 0010 空闲时不计数,不产生中断,时钟源为fosc/2,因此输出占用率为fosc/512
CL=0x00;
CH=0x00;
CCAPM0=0x42; //0100 0010, 8位 PWM
CCAP0L=0x00;
CCAP0H=0x00; //PWM实现方法,因为是8位,CL基础计数器从0xFF递减到0x00,溢出后将CCAP0H
//的值加载到CCAP0L,若CL递减过程中,若大于CCAP0L,则输出高电平,否则为低电平
CCAPM1=0x42;
CCAP1H=0x00;
CCAP1L=0x00;
CR=1; //开启PCA计数器
}
/*********************************************************************************************/
void pwm_set(uchar x,uchar y) //占空比设置函数
{
CCAP0H=x; //设置比较值
CCAP0L=x;
CCAP1H=y;
CCAP1L=y;
}
x用于设置P1.3的占空比,数值越大占空比越小
y用于设置P1.4的占空比,数值越大占空比越小
7. STC12C5A60S2 单片机PWM输出问题
PWM信号是占空比可调的,这种问题很少,用L298N驱动电机的话一般情况两个轮子转速还是不会有差别的。
要么你就修改
CCON = 0; //Initial PCA control register(PCA timer stop,Clear CF flag,Clear all mole interrupt flag)
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x04; //Set PCA timer clock source as timer0 overflow,Disable PCA timer overflow interrupt
CCAP0H = CCAP0L = 255; //PWM0 port output X% ty cycle square wave
CCAPM0 = 0x42; //PCA mole-0 work in 8-bit PWM mode and no PCA interrupt
CCAP1H = CCAP1L = 255; //PWM1 port output X% ty cycle square wave
CCAPM1 = 0x42; //PCA mole-1 work in 8-bit PWM mode and no PCA interrupt
CR = 1;
只要CCAPxH相同就可以正常工作。
误差很小的,也有可能是你负载的问题。