直流电机PWM调速与控制设计报告 - 图文

更新时间:2024-05-13 12:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

综 合 设 计 报 告

单 位: 自 动 化 学 院 学生姓名: 专 业: 测控技术与仪器 班 级: 0820801 学 号:

指导老师: 成 绩:

设计时间: 2011 年 12 月 重庆邮电大学自动化学院制

一、题目

直流电机调速与控制系统设计。 二、技术要求

设计直流电机调速与控制系统,要求如下: 1、学习直流电机调速与控制的基本原理; 2、了解直流电机速度脉冲检测原理;

3、利用51单片机和合适的电机驱动芯片设计控制器及速度检测电路; 4、使用C语言编写控制程序,通过实时串口能够完成和上位机的通信; 5、选择合适控制平台,绘制系统的组建结构图,给出完整的设计流程图。 6、要求电机能实现正反转控制; 7、系统具有实时显示电机速度功能; 8、电机的设定速度由电位器输入;

9、电机的速度调节误差应在允许的误差范围内。 三、给定条件

1、《直流电机驱动原理》,《单片机原理及接口技术》等参考资料; 2、电阻、电容等各种分离元件、IC、直流电机、电源等;

3、STC12C5A60S2单片机、LM298以及PC机; 四、设计

1. 确定总体方案; 2. 画出系统结构图;

3. 选择以电机控制芯片和单片机及速度检测电路,设计硬件电路; 4. 设计串口及通信程序,完成和上位机的通信; 5. 画出程序流程图并编写调试代码,完成报告;

直流电机调速与控制

摘要:当今社会,电动机作为最主要的机电能量转换装置,其应用范围已遍及国民经济的各个领域和人们的日常生活。无论

是在工农业生产,交通运输,国防,航空航天,医疗卫生,商务和办公设备中,还是在日常生活的家用电器和消费电子产品(如电

冰箱,空调,DVD等)中,都大量使用着各种各样的电动机。据资料显示,在所有动力资源中,百分之九十以上来自电动机。同

样,我国生产的电能中有百分之六十是用于电动机的。电动机与人的生活息息相关,密不可分。电气时代,电动机的调速控制一般

采用模拟法、PID控制等,对电动机的简单控制应用比较多。简单控制是指对电动机进行启动,制动,正反转控制和顺序控制。这

类控制可通过继电器,光耦、可编程控制器和开关元件来实现。还有一类控制叫复杂控制,是指对电动机的转速,转角,转矩,电压,电流,功率等物理量进行控制。

本电机控制系统基于51内核的单片机设计,采用LM298直流电机驱动器,利用PWM脉宽调制控制电机,并通过光耦管测速,

经单片机I/O口定时采样,最后通过闭环反馈控制系统实现电机转速的精确控制,其中电机的设定速度由电位器经A/D通过输入,

系统的状显示与控制由上位机实现。经过设计和调试,本控制系统能实现电机转速较小误差的控制,系统具有上位机显示转速和控制电机开启、停止和正反转等功能。具有一定的实际应用意义。

关键字:直流电机、反馈控制、51内核、PWM脉宽调制、LM298

一、 系统原理及功能概述

1、系统设计原理

本电机控制系统采用基于51内核的单片机设计,主要用于电机的测速与转速控制,硬件方面设计有可调电源模块,串口

电路模块、电机测速模块、速度脉冲信号调理电路模块、直流电机驱动模块等电路;软件方面采用基于C语言的编程语言,能实现系统与上位机的通信,并实时显示电机的转速和控制电机的运行状态,如开启、停止、正反转等。

单片机选用了51升级系列的STC12c5a60s2作为主控制器,该芯片完全兼容之前较低版本的所有51指令,同时它还自带

2路PWM控制器、2个定时器、2个串行口支持独立的波特率发生器、3路可编程时钟输出、8路10位AD转换器、一个SPI

接口等,能非常方便的满足本次电机控制的需求,其PWM端口用于输出一定频率且脉宽可调的PWM波用于控制电机转速,单片机自带的A/D端口作为设定速度的模拟信号输入口,定时器用于串口通信和速度的定时采样以及上位机的定时显示等。

系统的电机驱动单元选择了LM298N大功率驱动芯片,再利用TLP521光耦合器和整流二极管设计的驱动电路能实现电器隔离与控制,能提高控制效率和精度极大减少了挠动干扰,而且可以实现电机的正反装和刹车功能。

系统测速模块基于槽型光耦GK105设计,将电机的转速转换成不同频率的脉冲信号,在经过基于LM324的电压比较器和74HC573锁存器进行信号波形的整形,最后通过检测单片机的I/O口的脉冲实现速度的测量。

1.1直流电机基本工作原理

图1.1直流电机的基本结够图

1.2直流电机调速原理

直流电机转速n的表达式为:

n?U?IR (1 - 1) K?式中:U-电枢端电压;I-电枢电流;R-电枢电路总电阻;Φ-每极磁通量;K-与电机结构有关的常数,因此直流电机转速n的控制方法有三种,主要以调压调速为主。

本控制器主要通过脉宽调制PWM来控制电动机电枢电压,实现调速。调脉宽的方式有三种:定频调宽、定宽调频和调宽调频。

本系统采用了定频调脉宽方式的PWM控制,因为采用这种方式,电动机在运转时比较稳定;并且在采用单片机产生PWM脉冲的软件实现上比较方便。

对直流电机转速的控制即可采用开环控制,也可采用闭环控制。与开环控制相比,速度控制闭环系统的机械特性有以下优越性:

闭环系统的机械特性与开环系统机械特性相比,其性能大大提高;理想空载转速相同时,闭环系统的静差率(额定负载时电机转速降

落与理想空载转速之比)要小得多;当要求的静差率相同时, 闭环调速系统的调速范围可以大大提高。直流电机的速度控制方案如图1所示。

转速设定值 + - 偏差 转速输出 调节器 驱动电路 直流电机 测速装置 图 1 直流电机速度闭环控制方案

二、 系统硬件设计

1.系统总体设计框图

本系统采用STC12C5A60S作为控制核心,用上位机显示设定转速和测量转速以及控制电机。采用LM298驱动芯片作为本系统的驱动电路和用槽型光耦GK105作为该系统的测量电路。框图如2所示。

LM298

信号调理 电路

时钟电路 驱动电路 STC12C5A60S2单片机 UART串口电路 直流电机 光耦测速管 上位机显示与控制 速度模拟量输入电路 电源模块 图2 直流电机控制系统总体框图 2.模块电路及功能介绍

2.1单片机最小系统电路

单片机主要擅长系统控制,而不适合做复杂的数据处理,在设计单片机最小系统时我们选用STC12C5A60S2位DIP-40封装的单片

机作为MCU。STC12C5A60S2芯片是有宏晶科技生产的单时钟./机器周期(1T)的单片机,具有64K的用户程序存储空间及1280字节的

RAM,完全兼容之前较低版本的所有51指令,但速度快5—8倍,内部集成有MAX801专用复位电路、同时它还自带2路PWM控制器、2

个定时器、2个串行口支持独立的波特率发生器、3路可编程时钟输出、8路高速10位AD转换器、一个SPI接口等,应用于电机控制等强干扰场合。

本系统的单片机最小系统由时钟电路、复位电路、电源电路、外围总线接口等部分组成。图3为单片机最小系统结构框图。

图3 51最小系统电路

2.1.1系统时钟电路

单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激

振荡器,系统时钟电路结构如图6所示,可以根据情况选择6MHz、8MHz或12MHz等频率的石英晶体,本系统采用12MHz的晶振。补偿电容通常选择20-30pF左右的瓷片电容。 2.1.2复位电路

单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。上电复位要求接通电源后,自动实现复位操作。

手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。复位电路结构如图6所示。上电自动复位通过电容充电来实现。手动按键复位是通过按键将电阻与VCC接通来实现。

2.2电机驱动模块

直流电机驱动采用常用的H桥电路,通过控制信号选通对管与否实现电机的正反转,并改变所加电压的占空比来改变电机转速。

如图4所示,这里采用电机驱动专用芯片L298N,该芯片可驱动两路5‐36V的直流电机或者一路四拍的步进电机。同时在L298N

与主控芯片间通过四路光耦TLP521‐4隔离消除干扰信号。在STC12C5A60S2上配置好串口、PWM,实现串口接收的数据直接赋值给

PWM定时器CCAP1L、CCAP1H。利用串口调试助手发送控制信息给STC12C5A60S2,同时辅助外界6V电源更改L298N的IN1和IN2共

同完成L298N电机驱动模块的调试。

图4 LM298N电机驱动电路

2.3直流电机测速电路

2.3.1槽型光耦GK105测速电路

图 5 槽型光耦GK105电路

图 6 电机转速编码装置

如图5和图6所示,光电对管采用槽型光耦GK105电路由一只特殊的发光二极管和光电三极管构成,当二极管发出的光打在光电三极管的基极B上时三极管CE导通。而正常情况下二极管的光不能到达光电管的基极上,故通过装在电机转

轴上得圆形编码片即可实现对小车的测速。假设编码片儿有n片个缺口,测得光电三极管的输出脉冲频率为f,则车速=f/n。

由图7可知,电机每转一圈, 槽型光耦产生4个脉冲,因此可以利用槽型光耦传感器信号得到电机的实际转速。为尽可能缩短一次速度采样的时间,则电机的实际转速为: V=(N/4)*60; V:速度 R/min N:每秒采样的脉冲个数

图7 电机转1圈GK105光耦管信号 2.3.2速度脉冲信号调理电路

给电机加电让其带动编码盘旋转,将光电对管靠近编码盘,用示波器观测输出脉冲信号的有无与好坏。信号调理电路主要利用LM324运算放大器设计的比较器,如图8所示,调节比较器偏置电压使脉冲最接近于方波且幅度大于3.3V。为

了提高测速的精度,在信号后级添加比较器调理信号为标准的方波,调节比较器运放的偏置电压使方波信号最适合于测速。

图 8 基于LM324的信号调理电路

2.4串口电路设计

MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的接口电路,使用+5V单电源供电。其内部结构基本可分三个部分:第一部分是电荷泵电路,由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数据从T1OUT、T2OUT送到电脑DB9插头;

DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。第三部分是供电,15脚GND、16脚VCC(+5V)。电路如图9所示。

162738495DB9RS-232U2147+5V138C1916+T1_OUTT2_OUTR1_INR2_INT1_INT2_INR1_OUTR2_OUT1110129TXDRXDGND10uf/50V26C20+VCCV+V-GNDMAX232C1+C1-C2+C2-1345+C2110uf/50V15+C2210uf/50V10uf/50V

图 9 串口电路图

2.5系统电源设计

本系统要求有5V和6—7V的电源输入,因此我们选用了LM317作为电源芯片。LM317作为输出电压可变的集成三端稳压块,是一种使用方便、应用广泛的集成稳压块。其应用电路如图10所示。图11为电源滤波电路。

图10 3.3V稳压电路

图11 滤波电路

稳压电源的输出电压可用下式计算,Vo=1.25(1+R2/R1)。本系统中取R1为240n,R2取5K的可调电位器。通过调节R2的阻值大小,进而可以改变输出电压的大小,实现电压可调,其可调范围是Vo=1.25V—37V。在应用中,为了电路的稳定工作,在一般情况下,还需要接二极管作为保护电路,防止电路中的电容放电时的高压把317烧坏。

2.6电机设定速度输入电路

本系统采用了简单的电位器,通过电位器将5V电源信号分压在经过单片机A/D端口输入到CPU处理,实现电机速度手动的可调,其电路如图12所示。

图12 电位器速度设置电路

三、 系统软件设计

本程序主要分为6大块,主程序、A/D转换处理程序、PWM输出程序、串口显示与电机状态控制程序、定时器0的中断服务程序,串口中断服务程序。主程序主要做了系统初始化,定时器0的初始化和主循环等。配置STC12C5A60S2定时器0为定时器方式2、50ms计数器中断,累计20次定时器0中断为1秒,此时TL1即光电对管输入的脉冲频率,同时在此一秒内触发AD采集一次电源电压Voltage送入内存并通过运算转换成设定的速度值。PC终端的显示也是没隔一秒刷新一次。

配置STC12C5A60S2串行口1为方式2、独立波特率发生器9600、允许接收中断。当串口1接收到PC机数据转入中断处理程序,检测接收到的数据以此来区分数据是属于哪种控制信号。

配置STC12C5A60S2脉宽调制PWM为8位、无中断。主程序中循环执行Pwm()函数实时更改PWM定时器CCAP1L、

CCAP1H的值,实现对电机转速的控制。 1.主程序

主程序主要功能为系统初始化,定时器0的初始化和主循环等。流程图如图13所示

开始 系统初始化 速度脉冲信号输入I/O口扫描 否 1S计时标志 是 速度及A/D值采样 串口发送数据 PWM输出 结束

图13 系统主程序流程图 2.串口中断发送程序

本系统的串口通信指的是单片机与上位机(PC机)之间的串口通信,该通信主要用于测速模块的调试以及在测量转速时,单片机能从上位机(PC机)接收数据或者能将数据发回给上位机(PC机),以便观察电机转动情况,或者获得我们所需要的数据。

如图14所示,在本设计中,采用的是STC12C5A60S2芯片的串口UART0来与PC机进行串口通信。在串口UART0的配置中,定时/计数采用方式2是将两个8位计数器TH1和TL1分成独立的两个部分,组成一个8位可自动再装入的定时器/

计数器,由TL1作为8位计数器,TH1作为计数初值寄存器,设置初值时同时送TH1和TL1,当TL1计数满回0产生溢出,

不仅置位TF1,而且控制TH1中的初值重新装入TL1,继续下一轮计数,此信号送串行通信系统,以设置串行通信波特率,波特率设置公式如式所示:波特率=2 SMOD*(溢出率)/32 。

进入发送中断 发送1byte数据 否 1字节数据发送完毕 ? 是 发送第二字节数据 否 1字节数据发送完毕 ? 是 中断返回

图14 串口发送程序流程图

3.串口中断接收程序

上位机控制单元解扩出1bit数据后,产生一次中断。接收时首先采用16bits接收窗口、1bit滑动方式来接收通信的同步帧头0x09、0xAF,帧头接收成功后,后续数据按每8bits一个字节的方式进行截取,得到传送的有效数据,同时将得到的有效数据存储在缓冲单元中;接收过程中,按有关的通信协议进行地址判别、长度接收、校验计算。地址相同的模块对符合通信协议的数据进行应答,转入发送态。程序流程图如图15所示。

进入接收中断 清零接收标志 否 1字节数据接收完毕 ? 是 重组数据 中断返回

图15 串口接收程序流程图

4.A/D转换程序

A/D转换程序主要用于电机速度的输入模拟信号的采集与转换。程序流程图如图16所示。

启动指定通道 延时 否 转换结束? 是 返回转换结果

图16 A/D转换程序流程图

5.PWM输出程序

PWM控制——脉冲宽度调制技术,即通过一系列脉冲的宽度调制来等效地获得所需的波形(含形状和幅值),程序主要用于控制电机转速,他通过主程序的反馈算法计算出来,然后调整脉冲宽度来控制电机。程序流程图如图17所示。

设置寄存器CCON=0; 设置PWM模式寄存器CMOD=0x00,及PWM频率为系统时钟/12 设置寄存器PCA_PWM0=0x00; CCAPM0=0x42; 设置寄存器CCAP0H,CCAP0L,调节脉冲宽度 设置允许PCA计数器计数标志位CR

图17 PWM输出程序流程图

6.定时器0中断服务程序

定时器0中断程序主要用于1秒定时、转速的计算、A/D值采集以及上位机显示刷新。程序流程图如图18所示。

入口 计时赋初值 1秒计时标志? 是 否 计算转速,读取A/D,显示刷新 返回

图18定时器0中断服务程序流程图

四、 系统调试及性能分析

1. 系统硬件调试

1.1如图19为系统测速电路的采样波形

图19 经整形后的速度脉冲波形

1.2串口收发数据调试

串口电路是连接PC机与通信模块的桥梁,可借助串口调试助手对所设计的串口通信电路和通信模块进行测试。如图5.1所示,通过串口调试助手,向端口分别发送数据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.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,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 on title('电压V-----转速r/s') figure(2)

plot(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.67373 b=-28.8715);

上面两个关系式将作为电机控制的基本数学模型,有软件算法实现电机输出转速对输入电压的跟踪。

2.2 不同转速设定值下电机对应的输出转速及误差如表1

输入转速 12 17 22 27 33 42 45 48 53 58 62 65 69 73 116 119 122 输出转速 13 19 19 25 33 40 42 49 55 59 62 63 71 76 绝对误差 -1 -2 3 2 0 2 3 -1 -2 -1 0 2 -2 -3 输入转速 76 80 83 87 89 93 96 99 101 103 106 109 111 113 125 128 133 输出转速 80 78 81 89 93 97 94 99 102 104 105 112 111 112 125 130 131 绝对误差 -4 -2 2 -2 -4 -4 2 0 -1 -1 1 -3 0 1 0 -2 2 119 -3 117 2 126 -4 表1 电机转速误差表 2.3 电机输出转速误差曲线

图 23 电机输出转速相对电压绝对误差曲线

图 24 电机输出转速相对电压的相对误差曲线 2.4 系统性能分析

对上面图23、图24两个误差曲线分析可以得出以下结论,

一方面,当电机两端的电压在1.5V~4.8V范围了变化时,电机的转速变化范围在12R/S~134R/S(即720R/mint~8040R/mint)之间变化,当电机两端的电压在1.5V以下时,电机无法驱动,为电机的死区电压,电机转速变化基本符合实际情况。

另一方面,由于本系统自身设计本省存在着多种缺陷,所以测式结果产生了一定的误差,电机转速的绝对误差基本在6V以下,

其相对误差根据两端电压范围的不同呈现不同的趋势,当电压在1.5V~1.8V左右,即电机转速≤50R/S时,电机输出转速的相对误

差≤16%,当电机两端电压在1.8V~4.8V左右,即电机转速≥60R/S时,电机输出转速的相对误差≤8%。所以系统综合性能基本能

满足设计要求。

五、 设计心得

课程设计是培养我们综合运用所学知识发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。

本次的课程设计是基于运用所学单片机技术、传感检测技术、电机驱动技术等方面的知识,设计电机调速与控制系统,很好的

结合了当今工业直流电机方面的实际应用,相对于前几学期的课程设计,这次的题目综合性更高、设计难度更大、实用性更强,是

对我们所学专业知识如《单片机原理及接口技术》、《传感器与检测》、《C语言程序设计》、《直流电机驱动原理》等课程知识的综合

检验与应用,很好的锻炼了我们从单一模块到系统设计与调试能力的转变与提高,同时也让增强了我们直流电机控制原理与应用有了更深的认识和体会。

回顾起此次课程设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,我们小组都付出了很多努力,也收获了很多,在此

次设计中不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计也使我懂得了理论

与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能做出实

际的有用的东西,从而提高自己的实际动手能力和独立思考的能力。通过这次课程设计还锻炼了我们的团队合作精神,只有大家在分工明确的基础上齐心协力,才能使团队获得成就。

在这次设计的过程中我们也遇到了很多困难,尤其是我们小组有两个人都要考研,时间特别紧迫,还有就是这次在电机的控制

其设计和测速模块的设计上都遇到了很大的问题,但是我们在老师的指导下,我们小组积极讨论,分工合作,合理安排时间,通过查阅资料学习相关的知识,逐步突破了每一个技术难关,最后比较好的独立的完成了这次设计。

通过这次课程设计,我更发现了自己的很多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,而且缺少自主分析问题的能力,碰到问题后有一种和逃避依赖心理。也让我明白做电子类设计每一步都要细心严谨,不能马虎。

六、 参考文献

1.李朝青编.《单片机原理及接口技术》(简明修订版).北京航空航天大学出版社,1998 2.胡向东编《传感技术》.重庆大学出版社,2006年第1版。 3. 谭浩强 《C语言程序设计》. 北京:清华大学出版社,2002。

8. 后闲哲也编 《单片机C程序设计与实践丛书》 北京航空航天大学出版社 2008。

七、 附录

程序:#include #include

#include \typedef unsigned char INT8U;

typedef unsigned 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 //0000,0000 0 0 420 个时钟周期转换一次 //#define uchar unsigned char //#define uint unsigned int #define P2M0 0x00 #define P2M1 0x00 #define P0M0 0x00 #define P0M1 0x00

sbit caiji=P2^2; sbit led0=P2^0; sbit led1=P2^1;

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,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=(65536-50000)%6;

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; 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; //P14 }

INT8 ceshu() { if(caiji==0)

{ n1=1; }

//速度脉冲检测函数

if((caiji==1)&&(n1==1)) //脉冲上升沿检测 }

void UART(INT8 a,INT8 b,float c) { if(flag_uart==1)

//串口函数

{ shudu++; n1=0; } return shudu;

//串口显示标志判断

{ flag_uart=0; ES=0; TI=1;

switch(flag_on)

//显示模式及电机状态控制命令判断

{ case 0: puts(\

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_();_nop_(); led0=0;led1=1; break; case 3: printf(\ led0=0;led1=0; TR0=0;

break;

}

case 4: puts(\ break;

while(!TI); TI=0; ES=1; }

if(flag_xianshi==1) //串口显示标志判断 { flag_xianshi=0; ES=0; TI=1;

printf(\ }

void main()

//主函数部分

while(!TI);

TI=0; ES=1; }

{ INT8 shedin=180;

INT8 shesu1=0,uk1,uk=180,k1=0,uk2=0; ad_init();

// 单片机AD 初始化

// 单片机定时器 串口等寄存器 初始化

//

单片机PWM相关寄存器 初始化

//电压与速度拟合曲线的相关参数初始化

timer_init();

pwm_init();

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);

shedin=(INT8)(ad_val*a2-b2);

//AD采集设定电机两端电压

//频率脉冲检测与存储

//判断采样标志

shesu1=shedin;

if(cont2>=4)

{ if(shisu<=shedin)

{ k1=1; uk1=shedin-shisu; } else

{ uk1=shisu-shedin;

k1=0; //反馈速度偏差量ek }

if(k1==1)

{ if((shisu<=115)||(shisu>=60))

//设置不同速度范围内的偏差调整量

uk2=ad_val+uk1+3;

else

uk2=ad_val+uk1;

}

else if(k1==0)

{ if((shisu<=115)||(shisu>=65)) uk2=ad_val-uk1-3;

else

uk2=ad_val-uk1;

} }

//设置不同速度范围内的偏差调整量

else

{ uk2=ad_val; }

uk=uk2; ad_vall=ad_val; //经反馈校正后的pwm输出值 ad_fl=(float)ad_vall*5.0/256.0;

}

PWM(uk);

//pwm输出控制电机转速

UART(shisu,shesu1,ad_fl); //调用串口显示函数 } }

void delay0(INT8U delay_time) // 延时函数 void timer0()interrupt 1 //T0定时计数器中断 { TH0=(65536-50000)/256; TL0=(65536-50000)%6; cont++; if(cont==20)

//1秒定时计数 设定

//50ms计数初值

{ cont=0;

cont2++; flag_xianshi=1; flag_ad=1; shisu=moto_speed/4;

//将采集的频率换算成转速

moto_speed=0; shudu=0;

} }

void UART0()interrupt 4

//串口中断函数

{ RI=0; flag_uart=1; if(rec==1) flag_on=0; else if(rec==2) flag_on=1; else if(rec==3)

flag_on=2;

else if(rec==4)

flag_on=3;

else flag_on=4;

rec=SBUF;

本文来源:https://www.bwwdw.com/article/25y7.html

Top