华夏财富网

网站首页 优选知识 > 正文

单片机控制电机正反转程序(单片机控制电机)

2022-08-13 10:45:19 优选知识 来源:
导读 大家好,小福来为大家解答以上的问题。单片机控制电机正反转程序,单片机控制电机这个很多人还不知道,现在让我们一起来看看吧!1、通过与单...

大家好,小福来为大家解答以上的问题。单片机控制电机正反转程序,单片机控制电机这个很多人还不知道,现在让我们一起来看看吧!

1、通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过P3.6口按键触发启动直流电机,P3.7口的按键触发停止直流电机的运行。

2、由图可知,当P1.0输出高电平“1”时,NPN型三极管导通,直流电机得电转动;当P1.0输出低电平“0”时,NPN型三极管截止,直流电机停止转动。

3、扩展资料:通过单片机产生PWM波控制直流电机程序#include "reg52.h"#define uchar unsigned char#define uint unsigned intuchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示码(0-9)sbit xiaoshudian=P0^7;sbit wei1=P2^4; //数码管位选定义sbit wei2=P2^5;sbit wei3=P2^6;sbit wei4=P2^7;sbit beep=P2^3; //蜂鸣器控制端sbit motor = P1^0; //电机控制sbit s1_jiasu = P1^4; //加速按键sbit s2_jiansu= P1^5; //减速按键sbit s3_jiting=P1^6; //停止/开始按键uint pulse_count; //INT0接收到的脉冲数uint num=0; //num相当于占空比调节的精度uchar speed[3]; //四位速度值存储float bianhuasudu; //当前速度(理论计算值)float reallyspeed; //实际测得的速度float vv_min=0.0;vv_max=250.0;float vi_Ref=60.0; //给定值float vi_PreError,vi_PreDerror;uint pwm=100; //相当于占空比标志变量int sample_time=0; //采样标志float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,积分,微分常数void delay (uint z){uint x,y;for(x=z;x>0;x--)for (y=20;y>0;y--);}void time_init(){ET1=1; //允许定时器T1中断ET0=1; //允许定时器T0中断TMOD = 0x15; //定时器0计数,模式1;定时器1定时,模式1TH1 = (65536-100)/256; //定时器1值,负责PID中断 ,0.1ms定时TL1 = (65536-100)%6;TR0 = 1; //开定时器TR1 = 1;IP=0X08; //定时器1为高优级EA=1; //开总中断}void keyscan(){float j;if(s1_jiasu==0) //加速{delay(20);if(s1_jiasu==0)vi_Ref+=10;j=vi_Ref;}while(s1_jiasu==0);if(s2_jiansu==0) //减速{delay(20);if(s2_jiansu==0)vi_Ref-=10;j=vi_Ref;}while(s2_jiansu==0);if(s3_jiting==0){delay(20);motor=0;P1=0X00;P3=0X00;P0=0x00;}while(s3_jiting==0);}float v_PIDCalc(float vi_Ref,float vi_SpeedBack){register float error1,d_error,dd_error;error1=vi_Ref-vi_SpeedBack; //偏差的计算d_error=error1-vi_PreError; //误差的偏差dd_error=d_error-vi_PreDerror; //误差变化率vi_PreError=error1; //存储当前偏差vi_PreDerror=d_error;bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);return (bianhuasudu);}void v_Display(){uint sudu;sudu=(int)(reallyspeed*10); //乘以10之后强制转化成整型speed[3]=sudu/1000; //百位speed[2]=(sudu00)/100; //十位speed[1]=(sudu0)/10; //个位speed[0]=sudu; //小数点后一位wei1=0; //第一位打开P0=table[speed[3]];delay(5);wei1=1; //第一位关闭wei2=0;P0=table[speed[2]];delay(5);wei2=1;wei3=0;P0=table[speed[1]];xiaoshudian=1;delay(5);wei3=1;wei4=0;P0=table[speed[0]];delay(5);wei4=1;}void BEEP(){if((reallyspeed)>=vi_Ref+5||(reallyspeed{beep=~beep;delay(4);}}void main(){time_init();motor=0;while(1){v_Display();BEEP();}if(s3_jiting==0) //对按键3进行扫描,增强急停效果{delay(20);motor=0;P1=0X00;P3=0X00;P0=0x00;}while(s3_jiting==0);}void timer0() interrupt 1{}void timer1() interrupt 3{TH1 = (65536-100)/256; //1ms定时TL1 = (65536-100)%6;sample_time++;if(sample_time==5000) //采样时间0.1ms*5000=0.5s{TR0=0; //关闭定时器0sample_time=0;pulse_count=TH0*255+TL0; //保存当前脉冲数keyscan(); //扫描按键reallyspeed=pulse_count/(4*0.6); //计算速度pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);if(pwmif(pwm>100)pwm=100;TH0=TL0=0;TR0=1; //开启定时器0}num++;if(num==pwm) //此处的num值,就是占空比{motor=0;}if(num==100) //100相当于占空比调节的精度{num=0;motor=1;}}通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。

4、2、当然单片机的I/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。

5、像LG9110、CMO825等。

6、马达驱动IC可以将单片机I/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。

7、3、你要是不清除PWM是怎么回事呢,可以先作一些了解,再来知道有征对性地提问就好了。

8、单片机控制直流电机驱动芯片就可以控制直流电机了,我一般用L298N驱动芯片有4个单片机的信号输入口 两个使能端口,使能端口高电平使能,如果用不到的话直接接高电平就可以了 用得到的话接单片机,控制4单片机信号输入口的高低电平就能控制电机的正反转。

9、用PWM啊!一个引脚连续输出高低电平,通过驱动电路带动直流电机。

10、PWM占空比越大,转速越快,越小转速越低。

11、PWM用的很普遍,你去百度搜一下就知道了。

本文到此分享完毕,希望对大家有所帮助。


版权说明: 本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。


标签:




热点推荐
热评文章
随机文章