logo资料库

单片机电位器调节PWM控制.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
基于STC12C4052AD单片机电位器调节PWM控制微型直流电机无级调速实验
基于 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 芯片的主要功能应用实验就告一段落了。程序发现问
题,欢迎切磋。如若实验,粘贴/编译即可,若实际应用还应全面考量,如涉及 实际应用系统设计及问题,恕本人爱莫能助。
分享到:
收藏