1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。综 合 设 计 报 告 单 位: 自 动 化 学 院 学生姓名: 专 业: 测控技术与仪器 班 级: 0820801 学 号: 指导老师: 成 绩: 设计时间: 年 12 月 重庆邮电大学自动化学院制一、 题目直流电机调速与控制系统设计。二、 技术要求设计直流电机调速与控制系统, 要求如下: 1、 学习直流电机调速与控制的基本原理; 2、 了解直流电机速度脉冲检测原理; 3、 利用51单片机和合适的电机驱动芯片设计控制器及速度检测电路; 4、 使用C语言编写控制程序, 经过实时串口能够完成和上位机的通信; 5、 选择合适控制平台,
2、绘制系统的组建结构图, 给出完整的设计流程图。6、 要求电机能实现正反转控制; 7、 系统具有实时显示电机速度功能; 8、 电机的设定速度由电位器输入; 9、 电机的速度调节误差应在允许的误差范围内。三、 给定条件1、 直流电机驱动原理, 单片机原理及接口技术等参考资料; 2、 电阻、 电容等各种分离元件、 IC、 直流电机、 电源等; 3、 STC12C5A60S2单片机、 LM298以及PC机; 四、 设计1. 确定总体方案; 2. 画出系统结构图; 3. 选择以电机控制芯片和单片机及速度检测电路, 设计硬件电路; 4. 设计串口及通信程序, 完成和上位机的通信; 5. 画出程序流程图并编
3、写调试代码, 完成报告; 直流电机调速与控制摘要: 当今社会, 电动机作为最主要的机电能量转换装置, 其应用范围已遍及国民经济的各个领域和人们的日常生活。无论是在工农业生产, 交通运输, 国防, 航空航天, 医疗卫生, 商务和办公设备中, 还是在日常生活的家用电器和消费电子产品( 如电冰箱, 空调, DVD等) 中, 都大量使用着各种各样的电动机。据资料显示, 在所有动力资源中, 百分之九十以上来自电动机。同样, 中国生产的电能中有百分之六十是用于电动机的。电动机与人的生活息息相关, 密不可分。电气时代, 电动机的调速控制一般采用模拟法、 PID控制等, 对电动机的简单控制应用比较多。简单控制
4、是指对电动机进行启动, 制动, 正反转控制和顺序控制。这类控制可经过继电器, 光耦、 可编程控制器和开关元件来实现。还有一类控制叫复杂控制, 是指对电动机的转速, 转角, 转矩, 电压, 电流, 功率等物理量进行控制。本电机控制系统基于51内核的单片机设计, 采用LM298直流电机驱动器, 利用PWM脉宽调制控制电机, 并经过光耦管测速, 经单片机I/O口定时采样, 最后经过闭环反馈控制系统实现电机转速的精确控制, 其中电机的设定速度由电位器经A/D经过输入, 系统的状显示与控制由上位机实现。经过设计和调试, 本控制系统能实现电机转速较小误差的控制, 系统具有上位机显示转速和控制电机开启、 停
5、止和正反转等功能。具有一定的实际应用意义。关键字: 直流电机、 反馈控制、 51内核、 PWM脉宽调制、 LM298 一、 系统原理及功能概述1、 系统设计原理本电机控制系统采用基于51内核的单片机设计, 主要用于电机的测速与转速控制, 硬件方面设计有可调电源模块, 串口电路模块、 电机测速模块、 速度脉冲信号调理电路模块、 直流电机驱动模块等电路; 软件方面采用基于C语言的编程语言, 能实现系统与上位机的通信, 并实时显示电机的转速和控制电机的运行状态, 如开启、 停止、 正反转等。单片机选用了51升级系列的STC12c5a60s2作为主控制器, 该芯片完全兼容之前较低版本的所有51指令,
6、同时它还自带2路PWM控制器、 2个定时器、 2个串行口支持独立的波特率发生器、 3路可编程时钟输出、 8路10位AD转换器、 一个SPI接口等, 能非常方便的满足本次电机控制的需求, 其PWM端口用于输出一定频率且脉宽可调的PWM波用于控制电机转速, 单片机自带的A/D端口作为设定速度的模拟信号输入口, 定时器用于串口通信和速度的定时采样以及上位机的定时显示等。系统的电机驱动单元选择了LM298N大功率驱动芯片, 再利用TLP521光耦合器和整流二极管设计的驱动电路能实现电器隔离与控制, 能提高控制效率和精度极大减少了挠动干扰, 而且能够实现电机的正反装和刹车功能。 系统测速模块基于槽型光耦
7、GK105设计, 将电机的转速转换成不同频率的脉冲信号, 在经过基于LM324的电压比较器和74HC573锁存器进行信号波形的整形, 最后经过检测单片机的I/O口的脉冲实现速度的测量。11直流电机基本工作原理图1.1直流电机的基本结够图12直流电机调速原理直流电机转速n的表示式为: (1 - 1)式中:U-电枢端电压; I-电枢电流; R-电枢电路总电阻; -每极磁通量; K-与电机结构有关的常数, 因此直流电机转速n的控制方法有三种, 主要以调压调速为主。本控制器主要经过脉宽调制PWM来控制电动机电枢电压, 实现调速。调脉宽的方式有三种: 定频调宽、 定宽调频和调宽调频。本系统采用了定频调脉
8、宽方式的PWM控制, 因为采用这种方式, 电动机在运转时比较稳定; 而且在采用单片机产生PWM脉冲的软件实现上比较方便。对直流电机转速的控制即可采用开环控制,也可采用闭环控制。与开环控制相比,速度控制闭环系统的机械特性有以下优越性: 闭环系统的机械特性与开环系统机械特性相比,其性能大大提高;理想空载转速相同时,闭环系统的静差率( 额定负载时电机转速降落与理想空载转速之比) 要小得多;当要求的静差率相同时, 闭环调速系统的调速范围能够大大提高。直流电机的速度控制方案如图1所示。转速设定值转速输出偏差调节器驱动电路直流电机+ -测速装置图 1 直流电机速度闭环控制方案二、 系统硬件设计1系统总体设
9、计框图本系统采用STC12C5A60S作为控制核心, 用上位机显示设定转速和测量转速以及控制电机。采用LM298驱动芯片作为本系统的驱动电路和用槽型光耦GK105作为该系统的测量电路。框图如2所示。STC12C5A60S2单片机时钟电路LM298驱动电路UART串口电路直流电机上位机显示与控制光耦测速管速度模拟量输入电路信号调理电路 电源模块图2 直流电机控制系统总体框图2模块电路及功能介绍2.1单片机最小系统电路单片机主要擅长系统控制, 而不适合做复杂的数据处理, 在设计单片机最小系统时我们选用STC12C5A60S2位DIP-40封装的单片机作为MCU。STC12C5A60S2芯片是有宏晶
10、科技生产的单时钟./机器周期( 1T) 的单片机, 具有64K的用户程序存储空间及1280字节的RAM, 完全兼容之前较低版本的所有51指令, 但速度快58倍, 内部集成有MAX801专用复位电路、 同时它还自带2路PWM控制器、 2个定时器、 2个串行口支持独立的波特率发生器、 3路可编程时钟输出、 8路高速10位AD转换器、 一个SPI接口等, 应用于电机控制等强干扰场合。本系统的单片机最小系统由时钟电路、 复位电路、 电源电路、 外围总线接口等部分组成。图3为单片机最小系统结构框图。 图3 51最小系统电路2.1.1系统时钟电路 单片机内部具有一个高增益反相放大器, 用于构成振荡器。一般
11、在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器, 系统时钟电路结构如图6所示, 能够根据情况选择6MHz、 8MHz或12MHz等频率的石英晶体, 本系统采用12MHz的晶振。补偿电容一般选择20-30pF左右的瓷片电容。2.1.2复位电路 单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。上电复位要求接通电源后, 自动实现复位操作。手动复位要求在电源接通的条件下, 在单片机运行期间, 用按钮开关操作使单片机复位。复位电路结构如图6所示。上电自动复位经过电容充电来实现。手动按键复位是经过按键将电阻与VCC接通来实现。2.2电机驱动模块直流电机驱动采用常
12、见的H桥电路, 经过控制信号选通对管与否实现电机的正反转, 并改变所加电压的占空比来改变电机转速。如图4所示, 这里采用电机驱动专用芯片L298N, 该芯片可驱动两路536V的直流电机或者一路四拍的步进电机。同时在L298N与主控芯片间经过四路光耦TLP5214隔离消除干扰信号。在STC12C5A60S2上配置好串口、 PWM, 实现串口接收的数据直接赋值给PWM定时器CCAP1L、 CCAP1H。利用串口调试助手发送控制信息给STC12C5A60S2, 同时辅助外界6V电源更改L298N的IN1和IN2共同完成L298N电机驱动模块的调试。 图4 LM298N电机驱动电路2.3直流电机测速电
13、路2.3.1槽型光耦GK105测速电路图 5 槽型光耦GK105电路图 6 电机转速编码装置如图5和图6所示, 光电对管采用槽型光耦GK105电路由一只特殊的发光二极管和光电三极管构成, 当二极管发出的光打在光电三极管的基极B上时三极管CE导通。而正常情况下二极管的光不能到达光电管的基极上, 故经过装在电机转轴上得圆形编码片即可实现对小车的测速。假设编码片儿有n片个缺口, 测得光电三极管的输出脉冲频率为f, 则车速=f/n。由图7可知,电机每转一圈, 槽型光耦产生4个脉冲,因此能够利用槽型光耦传感器信号得到电机的实际转速。为尽可能缩短一次速度采样的时间,则电机的实际转速为: V=(N/4)*6
14、0; V:速度 R/minN:每秒采样的脉冲个数 图7 电机转1圈GK105光耦管信号2.3.2速度脉冲信号调理电路给电机加电让其带动编码盘旋转, 将光电对管靠近编码盘, 用示波器观测输出脉冲信号的有无与好坏。信号调理电路主要利用LM324运算放大器设计的比较器, 如图8所示, 调节比较器偏置电压使脉冲最接近于方波且幅度大于3.3V。为了提高测速的精度, 在信号后级添加比较器调理信号为标准的方波, 调节比较器运放的偏置电压使方波信号最适合于测速。 图 8 基于LM324的信号调理电路2.4串口电路设计MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的接口电路, 使用+5V单电源供
15、电。其内部结构基本可分三个部分: 第一部分是电荷泵电路, 由1、 2、 3、 4、 5、 6脚和4只电容构成。功能是产生+12V和-12V两个电源, 提供给RS-232串口电平的需要。第二部分是数据转换通道, 由7、 8、 9、 10、 11、 12、 13、 14脚构成两个数据通道。其中13脚( R1IN) 、 12脚( R1OUT) 、 11脚( T1IN) 、 14脚( T1OUT) 为第一数据通道。8脚( R2IN) 、 9脚( R2OUT) 、 10脚( T2IN) 、 7脚( T2OUT) 为第二数据通道。TTL/CMOS数据从T1IN、 T2IN输入转换成RS-232数据从T1O
16、UT、 T2OUT送到电脑DB9插头; DB9插头的RS-232数据从R1IN、 R2IN输入转换成TTL/CMOS数据后从R1OUT、 R2OUT输出。第三部分是供电, 15脚GND、 16脚VCC( +5V) 。电路如图9所示。图 9 串口电路图2.5系统电源设计本系统要求有5V和67V的电源输入, 因此我们选用了LM317作为电源芯片。LM317作为输出电压可变的集成三端稳压块, 是一种使用方便、 应用广泛的集成稳压块。其应用电路如图10所示。图11为电源滤波电路。图10 3.3V稳压电路图11 滤波电路稳压电源的输出电压可用下式计算, Vo=1.25( 1+R2/R1) 。本系统中取R
17、1为240n,R2取5K的可调电位器。经过调节R2的阻值大小, 进而能够改变输出电压的大小, 实现电压可调, 其可调范围是Vo=1.25V37V。在应用中, 为了电路的稳定工作, 在一般情况下, 还需要接二极管作为保护电路, 防止电路中的电容放电时的高压把317烧坏。2.6电机设定速度输入电路本系统采用了简单的电位器, 经过电位器将5V电源信号分压在经过单片机A/D端口输入到CPU处理, 实现电机速度手动的可调, 其电路如图12所示。图12 电位器速度设置电路三、 系统软件设计本程序主要分为6大块, 主程序、 A/D转换处理程序、 PWM输出程序、 串口显示与电机状态控制程序、 定时器0的中断
18、服务程序, 串口中断服务程序。主程序主要做了系统初始化, 定时器0的初始化和主循环等。配置STC12C5A60S2定时器0为定时器方式2、 50ms计数器中断, 累计20次定时器0中断为1秒, 此时TL1即光电对管输入的脉冲频率, 同时在此一秒内触发AD采集一次电源电压Voltage送入内存并经过运算转换成设定的速度值。PC终端的显示也是没隔一秒刷新一次。配置STC12C5A60S2串行口1为方式2、 独立波特率发生器9600、 允许接收中断。当串口1接收到PC机数据转入中断处理程序, 检测接收到的数据以此来区分数据是属于哪种控制信号。配置STC12C5A60S2脉宽调制PWM为8位、 无中断
19、主程序中循环执行Pwm( ) 函数实时更改PWM定时器CCAP1L、 CCAP1H的值, 实现对电机转速的控制。1主程序主程序主要功能为系统初始化, 定时器0的初始化和主循环等。流程图如图13所示 开始系统初始化速度脉冲信号输入I/O口扫描串口发送数据1S计时标志速度及A/D值采样PWM输出结束否是 图13 系统主程序流程图2串口中断发送程序本系统的串口通信指的是单片机与上位机( PC机) 之间的串口通信, 该通信主要用于测速模块的调试以及在测量转速时, 单片机能从上位机( PC机) 接收数据或者能将数据发回给上位机( PC机) , 以便观察电机转动情况, 或者获得我们所需要的数据。如图14
20、所示, 在本设计中, 采用的是STC12C5A60S2芯片的串口UART0来与PC机进行串口通信。在串口UART0的配置中, 定时/计数采用方式2是将两个8位计数器TH1和TL1分成独立的两个部分, 组成一个8位可自动再装入的定时器/计数器, 由TL1作为8位计数器, TH1作为计数初值寄存器, 设置初值时同时送TH1和TL1, 当TL1计数满回0产生溢出, 不但置位TF1,而且控制TH1中的初值重新装入TL1, 继续下一轮计数, 此信号送串行通信系统, 以设置串行通信波特率, 波特率设置公式如式所示: 波特率=2 SMOD*(溢出率)/32 。否发送第二字节数据1字节数据发送完毕 ? 进入发
21、送中断发送1byte数据1字节数据发送完毕 ? 是否中断返回是图14 串口发送程序流程图3串口中断接收程序 上位机控制单元解扩出1bit数据后, 产生一次中断。接收时首先采用16bits接收窗口、 1bit滑动方式来接收通信的同步帧头0x09、 0xAF, 帧头接收成功后, 后续数据按每8bits一个字节的方式进行截取, 得到传送的有效数据, 同时将得到的有效数据存储在缓冲单元中; 接收过程中, 按有关的通信协议进行地址判别、 长度接收、 校验计算。地址相同的模块对符合通信协议的数据进行应答, 转入发送态。程序流程图如图15所示。否重组数据进入接收中断清零接收标志1字节数据接收完毕 ? 是中断
22、返回 图15 串口接收程序流程图4A/D转换程序 A/D转换程序主要用于电机速度的输入模拟信号的采集与转换。程序流程图如图16所示。启动指定通道延时转换结束? 返回转换结果否是 图16 A/D转换程序流程图5PWM输出程序PWM控制脉冲宽度调制技术, 即经过一系列脉冲的宽度调制来等效地获得所需的波形( 含形状和幅值) , 程序主要用于控制电机转速, 她经过主程序的反馈算法计算出来, 然后调整脉冲宽度来控制电机。程序流程图如图17所示。设置寄存器CCON=0;设置PWM模式寄存器CMOD=0x00, 及PWM频率为系统时钟/12设置允许PCA计数器计数标志位CR设置寄存器PCA_PWM0=0x0
23、0;CCAPM0=0x42;设置寄存器CCAP0H, CCAP0L, 调节脉冲宽度图17 PWM输出程序流程图6定时器0中断服务程序 定时器0中断程序主要用于1秒定时、 转速的计算、 A/D值采集以及上位机显示刷新。程序流程图如图18所示。入口计算转速, 读取A/D, 显示刷新1秒计时标志? 返回否是计时赋初值 图18定时器0中断服务程序流程图四、 系统调试及性能分析1. 系统硬件调试1.1如图19为系统测速电路的采样波形 图19 经整形后的速度脉冲波形1.2串口收发数据调试串口电路是连接PC机与通信模块的桥梁, 可借助串口调试助手对所设计的串口通信电路和通信模块进行测试。如图5.1所示, 经
24、过串口调试助手, 向端口分别发送数据0x01、 0x02、 0x03、 0x04、 0x05数据经串口电路被单片机接收, 将数据进行存储判断, 决定是开启显示和电机还是正反转或是停止, 同时将所出状态及电机转速发送回来, 在串口调试助手的接收窗口上能够看到接收到的数据。串口调试如图20所示。 图20 电机转速及对应的电压显示数据1.3实物展示 图22 系统实物图2系统测试数据处理2.1利用matlab对电机两端电压和转速数据进行曲线拟合实型电压数据: votlage_V=1.5 1.6 1.7 1.8 1.9 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3 3.
25、1 3.2 3.3 3.41 3.49 3.61 3.71 3.8 3.9 4 4.1 4.21 4.3 4.4 4.51 4.6 4.7 4.8 4.9 5; 整型电压数据: votlage_D=77,82,87,92,97,102,108,113,118,123,128,133,138,143,148,153,159,164,169,175,179,185,190,195,200,205,210,216,220,225,231,236,241,246,251,255;测得速度数据: speed=12,17,22,27,33,42,45,48,53,58,62,65,69,73,76,80,
26、83,87,89,93,96,99,101,103,106,109,111,113,116,119,122,125,128,133,140,144;Matlab拟合命令: p=polyfit(votlage_V,speed,1);speed_poly1=p(1)*votlage_V+p(2);q=polyfit(votlage_D,speed,1);speed_poly2=q(1).*votlage_D+q(2);figure(1)plot(votlage_V,speed,or,votlage_V,speed_poly1);grid ontitle(电压V-转速r/s)figure(2)plo
27、t(votlage_D,speed,or,votlage_D,speed_poly2);grid on title(电压D-转速r/s)拟合曲线如图21所示: 图21 电压速度曲线如图21所示, 电机电压与转速基本成正比关系, 因此能够按最小二乘法进行线性拟合, 得到电压与转速关系式为: ( 1) 电压为实型, 转速=34.5178*电压V -28.91, 其中( a=34.5178, b=-28.91) ; ( 2) 电压为整型, 转速=0.67373*电压D-28.8715, 其中( a=0.67373b=-28.8715) ; 上面两个关系式将作为电机控制的基本数学模型, 有软件算法实现
28、电机输出转速对输入电压的跟踪。2.2 不同转速设定值下电机对应的输出转速及误差如表1输入转速输出转速 绝对误差输入转速输出转速 绝对误差1213-17680-41719-28078-22219383812272528789-2333308993-4424029397-445423969424849-1999905355-2101102-15859-1103104-162620106105165632109112-36971-211111107376-31131121116119-312512501191172128130-2122126-41331312 表1 电机转速误差表23 电机输出转速
29、误差曲线 图 23 电机输出转速相对电压绝对误差曲线 图 24 电机输出转速相对电压的相对误差曲线24 系统性能分析 对上面图23、 图24两个误差曲线分析能够得出以下结论, 一方面, 当电机两端的电压在1.5V4.8V范围了变化时, 电机的转速变化范围在12R/S134R/S( 即720R/mint8040R/mint) 之间变化, 当电机两端的电压在1.5V以下时, 电机无法驱动, 为电机的死区电压, 电机转速变化基本符合实际情况。 另一方面, 由于本系统自身设计本省存在着多种缺陷, 因此测式结果产生了一定的误差, 电机转速的绝对误差基本在6V以下, 其相对误差根据两端电压范围的不同呈现不
30、同的趋势, 当电压在1.5V1.8V左右, 即电机转速50R/S时, 电机输出转速的相对误差16%, 当电机两端电压在1.8V4.8V左右, 即电机转速60R/S时, 电机输出转速的相对误差8%。因此系统综合性能基本能满足设计要求。五、 设计心得课程设计是培养我们综合运用所学知识发现、 提出、 分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。本次的课程设计是基于运用所学单片机技术、 传感检测技术、 电机驱动技术等方面的知识, 设计电机调速与控制系统, 很好的结合了当今工业直流电机方面的实际应用, 相对于前几学期的课程设计, 这次的题目综合性更高、 设计难度
31、更大、 实用性更强, 是对我们所学专业知识如单片机原理及接口技术、 传感器与检测、 C语言程序设计、 直流电机驱动原理等课程知识的综合检验与应用, 很好的锻炼了我们从单一模块到系统设计与调试能力的转变与提高, 同时也让增强了我们直流电机控制原理与应用有了更深的认识和体会。回顾起此次课程设计, 至今我仍感慨颇多, 从选题到定稿, 从理论到实践, 我们小组都付出了很多努力, 也收获了很多, 在此次设计中不但能够巩固了以前所学过的知识, 而且学到了很多在书本上所没有学到过的知识。经过这次课程设计也使我懂得了理论与实际相结合的重要性, 只有理论知识是远远不够的, 只有把所学的理论知识与实践相结合起来,
32、 从理论中得出结论, 才能做出实际的有用的东西, 从而提高自己的实际动手能力和独立思考的能力。经过这次课程设计还锻炼了我们的团队合作精神, 只有大家在分工明确的基础上齐心协力, 才能使团队获得成就。在这次设计的过程中我们也遇到了很多困难, 特别是我们小组有两个人都要考研, 时间特别紧迫, 还有就是这次在电机的控制其设计和测速模块的设计上都遇到了很大的问题, 可是我们在老师的指导下, 我们小组积极讨论, 分工合作, 合理安排时间, 经过查阅资料学习相关的知识, 逐步突破了每一个技术难关, 最后比较好的独立的完成了这次设计。经过这次课程设计, 我更发现了自己的很多不足之处, 对以前所学过的知识理解
33、得不够深刻, 掌握得不够牢固, 而且缺少自主分析问题的能力, 碰到问题后有一种和逃避依赖心理。也让我明白做电子类设计每一步都要细心严谨, 不能马虎。六、 参考文献1李朝青编单片机原理及接口技术(简明修订版)北京航空航天大学出版社, 19982胡向东编传感技术.重庆大学出版社, 第1版。3. 谭浩强 C语言程序设计. 北京: 清华大学出版社, 。8. 后闲哲也编 单片机C程序设计与实践丛书 北京航空航天大学出版社 。七、 附录程序: #include #include #include STC_NEW_8051.Htypedef unsigned char INT8U;typedef unsig
34、ned int INT16U;typedef unsigned int INT8;/以下选择 ADC 转换速率, 只能选择其中一种 / SPEED1 SPEED0 A/D转换所需时间#define AD_SPEED 0x60 / 0110,0000 1 1 70 个时钟周期转换一次, / CPU工作频率21MHz时 A/D转换速度约 300KHz/#define AD_SPEED 0x40 /0100,0000 1 0 140 个时钟周期转换一次/#define AD_SPEED 0x20 /0010,0000 0 1 280 个时钟周期转换一次/#define AD_SPEED 0x00 /
35、0000,0000 0 0 420 个时钟周期转换一次/#define uchar unsigned char /#define uint unsigned int#define P2M0 0x00#define P2M1 0x00 #define P0M0 0x00#define P0M1 0x00sbit caiji=P22; sbit led0=P20; sbit led1=P21;INT8 flag_uart=0,flag_on=0,flag_x=0,flag_xianshi=0,flag_ad=0,n1=0;INT8 ad_vall=0,ad_val=0, moto_speed=0,
36、shudu=0,shisu=0;INT8U rec,cont=0,cont2=0; /串口、 计数器变量float ad_fl,a1=0,a2=0,b1=0,b2=0;INT8U get_AD_result(INT8U channel); /AD转换函数声明void delay0(INT8U delay_time); /延时函数声明void delay(char xms); void delay0(INT8U delay_time); / 延时函数void timer_init() /定时器计数器初始化函数 TMOD=0x21; TH0=(65536-50000)/256; TL0=(6553
37、6-50000)%256; TH1=0xfd; TL1=0xfd; TR1=1; ET0=1; SM0=0; SM1=1; REN=1; EA=1;ES=1;void ad_init() / 单片机AD 初始化函数 P1ASF=0x01; /1111,1111, 将 P1 置成模AD AUXR1 &= 0x04; /0000,0100, 令 ADRJ=0 ADC_CONTR |= 0x80; /1000,0000 打开 A/D 转换电源 void pwm_init()/ 单片机PWM相关寄存器 初始化函数 CCON=0; CL=0;CH=0;CMOD=0x00; PCA_PWM0=0x00;
38、CCAPM0=0x42;EPCnL=1, CCAPnL=FFH 时PWM固定输出低 */;PCA_PWM1=0x00;CCAPM1=0x42;CR=1; void PWM(INT8 a) INT8 xx; xx=256-a; CCAP0H=CCAP0L=0+xx; /P13 CCAP1H=CCAP1L=256-xx-5; /P14INT8 ceshu() /速度脉冲检测函数 if(caiji=0) n1=1; if(caiji=1)&(n1=1) /脉冲上升沿检测 shudu+; n1=0; return shudu;void UART(INT8 a,INT8 b,float c) /串口函数
39、 if(flag_uart=1) /串口显示标志判断 flag_uart=0; ES=0; TI=1; switch(flag_on) /显示模式及电机状态控制命令判断 case 0: puts(Turn on n); led0=0;led1=1; TR0=1; _nop_();_nop_();_nop_();_nop_();break; case 1: _nop_();_nop_(); led0=0;led1=0; _nop_();_nop_(); led0=1;led1=0;break; case 2: _nop_();_nop_(); led0=0;led1=0; _nop_();_no
40、p_(); led0=0;led1=1; break;case 3: printf(Turn off n); led0=0;led1=0; TR0=0;break;case 4: puts(Error!n); break; while(!TI); TI=0; ES=1; if(flag_xianshi=1) /串口显示标志判断 flag_xianshi=0; ES=0; TI=1; printf(real_speed is %d, set_speed is %d, voltage is%fn,a,b,c); while(!TI); TI=0; ES=1; void main()/主函数部分 I
41、NT8 shedin=180;INT8 shesu1=0,uk1,uk=180,k1=0,uk2=0;ad_init(); / 单片机AD 初始化 timer_init(); / 单片机定时器 串口等寄存器 初始化pwm_init(); /单片机PWM相关寄存器 初始化 a1=34.5178; a2=0.67373; /电压与速度拟合曲线的相关参数初始化 b1=28.91; b2=28.8715; P0=0xFF; cont2=0; led0=0;led1=0; /设置电机初始状态为停止 while(1) moto_speed=ceshu(); /频率脉冲检测与存储 if(flag_ad=1) /判断采样标志 flag_ad=0; ad_val=get_AD_result(0);/AD采集设定电机两端电压 shedin=(INT8)(ad_val*a2-b2); shesu1=shedin; if(cont2=4) if(shisu=shedin) k1=1; uk1