éè¿ä¸åçæºç¸è¿çæé®æ§å¶ç´æµçµæºåå¯ççµè·¯å¦ä¸å¾æ示ï¼éè¿P3.6å£æé®è§¦åå¯å¨ç´æµçµæºï¼P3.7å£çæé®è§¦ååæ¢ç´æµçµæºçè¿è¡ãç±å¾å¯ç¥ï¼å½P1.0è¾åºé«çµå¹³â1âæ¶ï¼NPNåä¸æ管导éï¼ç´æµçµæºå¾çµè½¬å¨;å½P1.0è¾åºä½çµå¹³â0âæ¶ï¼NPNåä¸æ管æªæ¢ï¼ç´æµçµæºåæ¢è½¬å¨ã
éè¿åçæºäº§çPWMæ³¢æ§å¶ç´æµçµæºç¨åº
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar 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å®æ¶ï¼æ¨¡å¼1
TH1 = (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; //å ³éå®æ¶å¨0
sample_time=0;
pulse_count=TH0*255+TL0; //ä¿åå½åèå²æ°
keyscan(); //æ«ææé®
reallyspeed=pulse_count/(4*0.6); //计ç®é度
pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);
if(pwm
if(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;
}
}
51单片机按键控制直流电机正反转和快慢
可以利用51单片机实现按键控制直流电机的正反转和速度调整。1. 按键与单片机的连接:首先,需要将按键连接到51单片机的I\/O端口。这些按键可以包括控制电机正转、反转和速度调整的按钮。每个按键对应单片机的一个或多个I\/O位,用于检测按键是否被按下。2. 电机控制逻辑编写:当单片机检测到特定按键被按下时...
如何用单片机控制直流电机
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I\/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I\/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是...
如何用单片机控制直流电机
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I\/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I\/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是...
怎样用单片机控制直流电动机
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I\/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I\/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是...
51单片机控制直流电机。(c语言控制)
第一种,通过PWM脉宽调制输出方法控制转速,控制占空比的大小可以实现调速!第二种,通过AD转换的方法控制直流电机的电压 第三种,用xtr115程控电流源来控制直流电机(类似第二种方法)如果以上的驱动能力不够的话再加上一个电压跟随器!程序方面就是一个寄存器的配置问题了,你查一下单片机的技术手册上面...
51单片机怎么让直流电机转动
一般而言,所有单片机的端口驱动能力都有限,还有电机的额定电压也许会比单片机的供电电压高,直接驱动电机有困难。这时候要想驱动电机,就必须根据电机的额定电压和额定功率采用合适的功率器件去驱动。下边的电路图是我工程上实际使用的,可以正反转,脉宽调制的话还可以调速。
单片机驱动直流电动机
可以再加一级放大,用8550即可,见图。原来的1K电阻可以适当的减小,680~470欧姆左右即可。此时,单片机输出低电平时,电机转动。--- 加那两个电阻,是进行电流限制,以免烧坏三极管和单片机引脚。3.3K电阻,是控制8550的基极电流,在1mA左右就基本够用;减小到1K也可,这时,电流将近5mA了,还可以的...
51单片机怎么驱动直流电机c语言
51单片机驱动直流电机程序(用的是l298n芯片):include<reg51.h> include<math.h> defineuintunsignedint defineucharunsignedchar defineN100 sbit s1=P1^0;\/\/电机驱动口 sbits2=P1^1;\/\/电机驱动口 sbits3=P1^2;\/\/电机驱动口 sbits4=P1^3;\/\/电机驱动口 sbiten1=P1^4;\/\/电机使能端 sbiten2...
如何让单片机驱动直流电机正反转
如上图所示包括单片机的最小系统,同时用到了4个PNP三极管,通过控制P1.3,P1.4和P2.2 P2.4的电平的高低从而分别控制三极管的导通和断开。当P1.3=1,P1.4=0时;三极管Q1导通,Q2断开;P2.2=1,P2.4=0;三极管Q3导通,Q4断开;此时直流电机正转。当P1.3=0,P1.4=1时;三极管Q1断开...
单片机控制 12V 0.3A的直流无刷电机(风扇) 如何驱动
单片机控制 12V 0.3A的直流无刷电机(风扇) 驱动分为高电平驱动和低电平驱动:电平驱动IO 口 经一个2K的电阻 ,接到一个三极管 b ,风扇正极接 12V+,风扇负极接三极管 c , 三极管 e接GND (三极管 用NPN 8050 )。电动机的转子上粘有已充磁的永磁体 ,为了检测电动机转子的极性,在电动机内装...