|
我为了排版,排了一个小时。。
设计亮点是:
示波器显示正反转的占空比波形。
1、示波器的蓝色线:代表电机反转
2、示波器的黄色线:代表电机正转
3、外接电源可调
4、液晶显示不会乱码
5、程序有一定的注释
有完整的程序+仿真原件+仿真调试的过程说明!在附件!!!
Proteus仿真测试:
一、电机启动测试
仿真部分采用的是Proteus软件,如图1所示,程序在加载完之后系统处于静止的状态,液晶屏幕也不会有显示。在这时我们只需要按下仿真左下角的开始按键,但这时系统还不能完全工作,还需要手动按下开始按键,如图2所示,系统默认的脉冲是50%然后转速是968rpm/min。
图1 系统整体仿真图
图2 系统的启动 二、 电机调速测试
电机的转速加快是通过脉冲波形的变化实现的,如图3所示,现在的脉冲是50%速度是927rpm/min,和上图的速度不一致是因为电机在运行过程中,即使电压一致也不能完全保障电机的速度不会发生变化,我们想要电机速度增加那么就要按下加速的按键,为了使电机的变化速度较为明显,我们以30%为一个加速标准值,如图4所示,当前屏幕显示的脉冲是80%,速度变成了1512rpm/min,速度是已经提升上去了。最大速度是占空比为100%,这时如图5所示,1877rpm/min,电压+23.1。
图3 初始速度界面
图4 加速之后界面
图5 最大转速界面 同理想要转速减慢,我们还是以50%的脉冲作为参照情况,这时屏幕显示的速度是967rpm/min,这时我们按下减按键,同样我们以30%为一个减速标准值,这时如图6所示,脉冲调整成了20%,就会发现速度真的下降了变成了427rpm/min,这里验证电机转速的减速也成功了。下降的速度与上升的速度在相同比例占空比的调节下实现的减速量也是基本一致的,没有出现较大的且不能接受无法控制在一定范围内的误差。最小速度是占空比为0,这时如图7所示,转速不再液晶屏显示数据,所以为0 rpm/min,电压值+0.00V。
图6 初始速度界面
图7 减速之后界面
图8 减速到0之后界面 三、 电机正反转测试
正反转的测试在电路中需要观察电机的旋转方向或者电压值,如图9所示,示波器显示的是黄色波形,并且电机旋转的方向是顺时针,如图10所示,按下反转按键后示波器显示的是蓝色波形,电机会逆时针旋转。这样电机便可带动窗帘实现拉开和关闭窗帘的工作。
图9正转界面
图10反转界面
单片机源程序:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- void displaym();
- sbit en=P2^5; //1602 6管脚
- sbit rs=P2^7; //1602端口 4管脚
- sbit rw=P2^6;//lcd1602控制端口 5管脚
- sbit num1=P1^0; //占空比加1
- sbit num2=P1^1; //占空比减一
- sbit num3=P1^2; //正传
- sbit num4=P1^3; //反转
- sbit num5=P1^4; //开始停止切换
- sbit out=P3^4; //PWM输出用于正传
- sbit out1=P3^7; //PWM输出用于反转
- uint zhuansu,flag,m,flag_1,zheng,fan,kai,j,su,qian,bai,shi,ge;
-
- void delay(uint z)//延时1ms函数
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<110;y++);
- }
- void write_com(uchar com)//向1602写一字节(控制指令)
- {
- rs=0;
- P0=com;
- delay(5);
- en=1;
- delay(10);
- en=0;
- }
- void write_data(uchar date)//向1602写一字节(数据)
- {
- rs=1;
- P0=date;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void init()//初始化函数
- {
- en=0;
- rw=0;
- write_com(0x38); //5X7显示
- write_com(0x0c); //关闭光标
- write_com(0x01); //lcd初始化
- TMOD=0x11; //定时器方式1
- TH0=0xdc;
- TL0=0x00; //定时器装入初值
- EA=1; //开总中断
- ET0=1; //定时器0开中断
- TR0=1;
- EX1=1;
- IT1=1; //定时器启动
- TH1=0xfc;
- TL1=0x66;//定时100us
- ET1=1; //定时器1开中断
- TR1=1;
- write_com(0x80); //第一行第一位显示V:
- write_data('V');
- write_data(':');
- write_com(0x87); //第一行第三位显示转速 千位、百位、十位、个位
- write_data('r');
- write_data('p');
- write_data('m');
- write_data('/');
- write_data('m');
- write_data('i');
- write_data('n');
- write_com(0xc0); //第二行显示zhankongbi:
- write_data('z');
- write_data('h');
- write_data('a');
- write_data('n');
- write_data('k');
- write_data('o');
- write_data('n');
- write_data('g');
- write_data('b');
- write_data('i');
- write_data(':');
- displaym();
- }
-
- void keyscan() //键盘扫描函数
- {
- if(num1==0)
- {
- delay(50); //消除抖动
- if(num1==0)
- {
- if(m<=199)
- m++;
- displaym(); //设定占空比加一
- }
- }
- if(num2==0)
- {
- delay(50);
- if(num2==0)
- {
- if(m>=1)
- m--;
- displaym(); //设定占空比减一
-
- }
- }
- if(num3==0) //正转
- {
- delay(50);
- if(num3==0)
- {
- zheng=1;
- fan=0;
- }
-
- }
- if(num4==0) //反转
- {
- delay(50);
- if(num4==0)
- {
- zheng=0;
- fan=1;
-
- }
- }
- if(num5==0)
- {
- delay(50);
- if(num5==0)
- {
- while(num5==0) ;
- kai=1-kai;
-
- }
- }
-
- }
- void display()
- {
- zhuansu=zhuansu*30; //将两秒内的计数乘以30得到转每分
- su=zhuansu*0.01*2*3.14/2; //0.0001 得到的是10转左右
- /////////////////////////***********************////////////////////////////////////////
- write_com(0x82);
- if(su/1000%100!=0)
- write_data(su/1000%100+0x30); //如果qian位不为0则显示千位否则显示空格
- else
- write_data(' ');
- if(su/100%10!=0)
- write_data(su/100%10+0x30); //如果bai不为0则显示百位否则显示空格
- else
- write_data(' ');
- if(su/10%10!=0)
- write_data(su/10%10+0x30); //如果shi位不为0则显示十位否则显示空格
- else
- write_data(' ');
- if(su%10!=0)
- write_data(su%10+0x30); //如果ge位不为0则显示个位否则显示空格
- else
- write_data(' ');
- write_com(0xd0);
- //////////////*******************************************////////////////////////////////////////
- // write_com(0x82);
- // qian=(su/1000)%100;
- // write_data(qian+0x30);
- //
- // bai=(su/100)%10;
- // write_data(bai+0x30);
- //
- // shi=(su/10)%10;
- // write_data(shi+0x30); //显示000000,
- //
- // ge=su%10;
- // write_data(ge+0x30);
- //
- // write_com(0xd0);
- ////////////********************************//////////////////////////////
- }
- void displaym()
- {
- write_com(0xcb);
- if(m/200%10!=0)
- write_data(m/200%10+0x30); //如果占空比百位不为0则显示百位否则显示空格
- else
- write_data(' ');
-
- if(m/200%10==0&&m/20%10==0)
- write_data(' ');
- else
- write_data(m/20%10+0x30); //如果占空比小于10 十位正常显示 否则显示空格
-
- write_data(m/2%10+0x30); //显示个位
- }
- void main()
- {
- flag_1=0;
- m=100; //占空比为100
- zhuansu=0; //转速初值0
- flag=0;
- zheng=1; //初始化电机正转动
- fan=0;
- j=67;
- init(); //初始化
- while(1)
- {
- keyscan(); //键盘扫描程序
- }
- }
- void int1()interrupt 2 //外部中断1脉冲技术记录电机的转速 电机转一圈zhuansu加一
- {
- zhuansu++;
- }
- void int2()interrupt 1 //定时器0显示转速
- {
-
- TH0=0xdc;
- TL0=0x00;//定时10ms
- flag++;
-
- if(flag==200) //计时到达2s
复制代码 |
评分
-
查看全部评分
|