基于 STC12C4052AD 单片机电位器调节 PWM 控制微型直流电机无级调速实验
用 STC 单片机做完电压表演示后,很想做一做 STC 片内 A/D 转换与 PWM 的联用,
此前曾用过它的 PWM 功能,是双键控制 LED 发光管调光的应用,此次决定搞一次
电位器调光/调速的实验;器材如下:1.STC12C4052AD 单片机最小系统。2.10K
可调电阻。3.光驱出/进仓驱动微电机一只。
电路图如下:
实验程序如下:
//单片机头文件
/********************************************************************
**
基于 STC 单片机的电位器调节微型直流电机无级调速演示程序---wannenggong
程序根据杜洋的程序模板改编
由电位器获得直流变量经片内 ADC 进行 A/D 转换,转换值控制片内 PWM 驱动微电
机
*********************************************************************
*/
#include
#include
#define uchar unsigned char
#define uint unsigned int
uint M;
sbit ON=P3^0;
/*****************************************************************
函数名:毫秒级 CPU 延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为 0)
返回值:无
结 果:占用 CPU 方式延时与参数数值相同的毫秒时间
备 注:应用于 1T 单片机时 i<600,应用于 12T 单片机时 i<125
/******************************************************************/
//51 基本运算(包括_nop_空函数)
void DELAY_MS (uint a){
uint i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*******************************************************************
函数名:8 位 A/D 转换函数
调 用:? = Read ();
参 数:无
返回值:8 位的 ADC 数据
结 果:读出指定 ADC 接口的 A/D 转换值,并返回数值
备 注:适用于 STC12C2052AD 系列单片机(必须使用 STC12C2052AD.h 头文件)
*******************************************************************/
uchar Read (uchar CHA){
uchar AD_FIN=0;
/******以下为 ADC 初始化程序****************************/
//存储 A/D 转换标志
CHA &= 0x07;
//选择 ADC 的 8 个接口中的一个(0000 0111 清 0
高 5 位)
ADC_CONTR = 0x40;
_nop_();
ADC_CONTR |= CHA;
_nop_();
ADC_CONTR |= 0x80;
DELAY_MS(1);
//ADC 转换的速度设定
//选择 A/D 当前通道
//启动 A/D 电源
//使输入电压达到稳定(1ms 即可?
/******以下为 ADC 执行程序****************************/
ADC_CONTR |= 0x08;
//启动 A/D 转换(0000 1000 令 ADCS =
1)
_nop_();
_nop_();
_nop_();
_nop_();
while (AD_FIN ==0){
AD_FIN = (ADC_CONTR & 0x10); //0001 0000 测试 A/D 转换结束否
}
ADC_CONTR &= 0xE7;
//等待 A/D 转换结束
//1111 0111 清 ADC_FLAG 位, 关闭 A/D
转换,
return (ADC_DATA);
}
//返回 A/D 转换结果(8 位)
/**********PWM 初始化函数****************************************/
void PWM_init (void){
CMOD=0x02;
//PCA 工作模式设定
CL=0x00;
CH=0x00;
//PCA 计数器低 8 位置 0
//PCA 计数器高 8 位置 0
CCAPM1=0x42;
//设置为脉宽调节 PWM 方式(0100 0010)
CCAP1L=0x00;
CCAP1H=0x00;
CR=1;
//CCAP1L 复位
//CCAP1H 复位
//启动 PCA 定时器
}
/**********PWM1 占空比赋值函数***********************************/
void PWM1_set (uchar a){//输出为可调方波
CCAP1L=a; //CCAP1L 赋值
CCAP1H=a; //CCAP1H 赋值
}
/****************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
****************************************************************/
void main (void)
{
PWM_init ();
P1M0 = 0x03;
P1M1 = 0x00;
//P1.0/P1.1:0000 0011(高阻)
//P1.0/P1.1:0000 0000
ON=1;
while(1){
if(ON==0)
{ISP_CONTR=0x60;}
else
//STC 软件下载提示信号检测
//从 STC 的 ISP 区开始运行程序的软件复位设置
{
M=Read(0);
PWM1_set(M);
}
}
}
//P1.0 口模拟量转换
//转换结果为 PWM 赋值
结果与结论:经实验,调整 KW,电机由停止到最高转速可以平滑过渡,若将电
机换成 LED 则可均匀调光。用于电机调速时,由于电机的最小启动电压的限制,
5V 系统中只能在 1.8V/4.8V 之间调节,由此看来,实际应用时,务必要选择具
有减速机构的直流电机才有价值,另外,此实验只是在电机无负荷状态下进行的
演示,实际应用时,有必要加入速度反馈系统,进行闭环控制,才能得到真实结
果,至于反馈信号的获得,有磁电式、光电式、霍尔元件等等方法很多,在此就
不细究了,至此,这片 STC 芯片的主要功能应用实验就告一段落了。程序发现问
题,欢迎切磋。如若实验,粘贴/编译即可,若实际应用还应全面考量,如涉及
实际应用系统设计及问题,恕本人爱莫能助。