STC 单片机的 PWM怎么用?
12C5412AD的PWM需要配置那些寄存器? 资料很乱看不懂 可以直接使用定时器,软件生成PWM我使用时5608AD,使用的就是软件生成PWM,感觉使用它的PWM功能不是很方便,不想AVR和MSP430 慢慢看就明白了。
给你一个参考:
http://www.doyoung.net/program/PWM/index.html STC 的datasheet 像打广告的。。。 要配置三个:
1.时钟源 T0 、fsys/2、fsys/12
2.配置成为PWM模式,好像有个0X42的
3。使能PWM输出
在CL到顶之前装载CH
前天用来生成标准三相SPWM波的…… 我现正使用STC12C5608AD,跪求:用AD功能把P1.0(ADC0/CLKOUT1/P1.0)脚输入电压转过来的值,用P3.7脚(PWMO/PCA0)生成PWM输出,
我P1.0的电压随光敏电阻变化的。
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_599702SSVUSX.jpg
电路图 (原文件名:电路图.jpg) 我现正使用STC12C5608AD,跪求:用AD功能把P1.0(ADC0/CLKOUT1/P1.0)脚输入电压转过来的值,程式写成这样,不知怎修改,
#include "STC12C5620AD.H"
sbitVACCT=P3^5;
sbitPWM0=P3^7;
sbitSYSPOWER=P1^3;
sbitPCSW=P1^2;
sbit Lightness=P1^0;
//---------------------------------------------------------------------
//以下选择 ADC 转换速率,只能选择其中一种
// SPEED1 SPEED0A/D转换所需时间
#define AD_SPEED 0x60 //0110,0000 1 1 270个时钟周期转换一次,
// CPU工作频率27MHz时,
// A/D转换速度约100KHz
//#define AD_SPEED 0x40 //0100,0000 1 0 540个时钟周期转换一次
//#define AD_SPEED 0x20 //0010,0000 0 1 810个时钟周期转换一次
//#define AD_SPEED 0x00 //0000,0000 0 0 1080个时钟周期转换一次
//---------------------------------------------------------------------
#define uchar unsigned char
unsigned charaa,bb;
void delay(uchar dd)
{
int x,y;
for(x=dd;x>0;x--)
for(y=100;y>0;y--);
}
void PWMInitial( void ) // 初始化PWM
{
CMOD = 0x05; // 设置PWM的时钟源 : T0溢出 并置位ECF开启PCA计数器阵列溢出标志
CL = 0x00; // PCA初值
CH = 0x00;
// PWM0 控制
CCAP0L = 0xc0; // 设置比较值控制脉宽
CCAP0H = 0xc0; // CCAPnL 与 CCAPnH 值应相同
CCAPM0 = 0x42; // 模块工作模式设置为PWM输出
PCA_PWM0 = 0x00; // 清零PWM模式下的第9位
// EPCA_LVD = 1; // 允许PCA中断及低压检测中断此位不打开将无法产生PCA中断
CR = 1; // 开启PWM
}
unsigned char Read_ADC(unsigned char adcvcc)
{
//将P1.0--P1.1设置成适合AD转换的模式
ADC_CONTR = ADC_CONTR|0x80; //1000,0000打开A/D转换电源
delay(20); //20ms
ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位
ADC_CONTR = ADC_CONTR&0xf8|adcvcc; //设置当前通道号
delay(10); //延时使输入电压达到稳定
ADC_DATA = 0; //清A/D转换结果寄存器
ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换
do { ; }
while((ADC_CONTR & 0x10)==0); //0001,0000等待A/D转换结束
ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG和ADC_START位,停止A/D转换
return ADC_DATA;
}
void main()
{
CLK_DIV = 0x00; // 时钟分频 :不分频
//里要加上设置ADC的端口,如,P1.1设为ADC口的话:
P1M0 = 0x03; //0000,0011用于A/D转换的P1.x口,先设为开漏
P1M1 = 0xC3; //0000,0011P1.0--P1.1先设为开漏。断开内部上拉电阻
bb=0x01;
PCSW=1;
delay(0x2000);
while(1)
{
if(!VACCT)
{
SYSPOWER=0;
delay(0x10);
PCSW=0;
delay(0x10);
PCSW=1;
aa=Read_ADC(1); //第一路A/D转换;如要改别的路,只要把代入通道改一下.
P3=aa;//这是让A/D的数据显示在P3口的LED上.
if(VACCT==0)
{
delay(0x10);
if(VACCT==0)
{
delay(0x2000); //这个延时代定
PCSW=0;
delay(0x10);
PCSW=1;
}
delay(0x2000);
SYSPOWER=1;
}
}
}
} 回复【4楼】zzjjhh250 华电电子
-----------------------------------------------------------------------
大哥 发份程序看下可以不706887334@qq.com不胜感激啊 卡在这里我 呵呵 学习了 正在折腾12c2052 用stc125a60s2比较方便呐 这个想法真不赖,好
页:
[1]