利用Proteus8.6,元器件库编码器电机结合51单片机,进行速度测量由此可以延伸利用仿真实现PID电机转速控制(请自行设计)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /***********头文件声明************/
- #include "reg52.h"//此文件中定义了单片机的一些特殊功能寄存器
- /***********数据类型声明***********/
- typedef unsigned int u16;//对数据类型进行声明定义
- typedef unsigned char u8;
- /***********IO口相关定义***********/
- sbit LSA=P2^0;
- sbit LSB=P2^1;
- sbit MOTOR=P2^2;
- /**********变量定义*************/
- u16 Pulse;
- u16 Speed;
- u16 pwm;
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函数名 :DigDisplay()
- * 函数功能 :数码管显示函数
- *******************************************************************************/
- void DigDisplay()
- {
- u8 disp[2];
- u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- u8 i;
- for(i=0;i<2;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=1; break;//显示第0位
- case(1):
- LSA=1;LSB=0; break;//显示第1位
- }
- P0=disp[i];//发送数据
- delay(10); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- disp[0]=smgduan[Speed/10];
- disp[1]=smgduan[Speed%10];
- }
- /*******************************************************************************
- * 函 数 名 : Int0Init()
- * 函数功能 : 设置外部中断0
- *******************************************************************************/
- void Int0Init()
- {
- //设置INT0
- IT0=1;//跳变沿出发方式(下降沿)
- EX0=1;//打开INT0的中断允许。
- EA=1;//打开总中断
- }
- /*******************************************************************************
- * 函 数 名 : Timer0Init
- * 函数功能 : 定时器0初始化
- *******************************************************************************/
- void Timer0Init()
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- TH0 = 0xFC;//给定时器赋初值,定时1ms
- TL0 = 0x18;
- ET0=1;//打开定时器0中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- *******************************************************************************/
- void main()
- {
- Int0Init();
- Timer0Init();
- pwm=50;
- while(1);
- }
- /*外部中断0的中断函数*/
- void Int0() interrupt 0
- {
- Pulse++;//脉冲++
- }
- /*定时器0的中断函数*/
- void Timer0() interrupt 1
- {
- static u8 Period,dis,PWM_Period;
- TH0 = 0xFC;//定时1ms
- TL0 = 0x18;
- Period++;
- PWM_Period++;
- dis++;
- /*******转速计算********/
- if(Period == 100)//1*100ms
- {
- //计算速度S=(Pulse/360)*10*60 r/min
- Speed=(Pulse)*1.6;
- Pulse=0;
- Period=0;
- }
- /*******PWM 输出********/
- if(PWM_Period < pwm) MOTOR=1;
- if(PWM_Period >= pwm) MOTOR=0;
- if(PWM_Period == 100) PWM_Period=0;
- /*******数码管显示********/
- if(dis == 4)
- {
- DigDisplay();//数码管显示函数
- dis=0;
- }
- }
复制代码
所有资料51hei提供下载:
基于51单片机的转速测量.zip
(139.97 KB, 下载次数: 122)
|