單片機c語言直流電機
1. 51單片機中如何用c語言控制直流電機正反轉
#include <毀跡reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IN1=P1^0;
sbit ENA=P1^1; //左輪 1
sbit IN2=P1^2;//左輪2
sbit IN3=P1^3;//右輪 1
sbit ENB=P1^4;
sbit IN4=P1^5;//右輪 2
sbit left=P0^0;
sbit right=P0^1;
/纖州並/sbit middle=P0^2;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
ENA=0; // 1
ENB=0; //
IN1=0; // 0
IN2=0; // 2
IN3=0;
IN4=0;
}
void pwm()
{
ENA=1;
ENB=1;
}
void dianji()
{
if(left==0&&right==0) //前進
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
pwm();
}
else if(left==0&&right==1) //右轉
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
pwm();
} else if(left=1&&right==0)// 左轉跡旁
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
pwm();
}
}
void main()
{
init();
while(1)
{
dianji();
}
}
2. 51單片機怎麼驅動直流電機c語言
51單片機驅動直流電機程序(用的是l298n晶元):
#include<reg51.h>
#include<math.h>
#defineuintunsignedint
#defineucharunsignedchar
#defineN100
sbits1=P1^0;//電機驅動口
sbits2=P1^1;//電機驅動口
sbits3=P1^2;//電機驅動口
sbits4=P1^3;//電臘鬧機驅動口
sbiten1=P1^4;//電機使能端
sbiten2=P1^5;//電機使能端
sbitLSEN=P2^0;//光電對管最左
sbitLSEN1=P2^1;//光電對管左1
sbitLSEN2=P2^2;//光電對管左2
sbitRSEN1=P2^3;//光電老碼對管右1
sbitRSEN2=P2^4;//光電對管右2
sbitRSEN=P2^5;//光電對管最右
uintpwm1=0,pwm2=0,t=0;
voiddelay(uintxms)
{
uinta;
while(--xms)
{
for(a=123;a>0;a--);
}
}
voidmotor(ucharspeed1,ucharspeed2)
{
if(speed1>=-100&&speed1<=100)
{
pwm1=abs(speed1);
if(speed1>0)
{
s1=1;
s2=0;
}
if(speed1==0)
{
s1=1;
s2=1;
}
if(speed1<0)
{
s1=0;
s2=1;
}
}
if(speed2>=-100&&speed2<=100)
{
pwm2=abs(speed2);
if(speed2>0)
{
s3=1;
s4=0;
}
if(speed2==0)
{
s3=1;
s4=1;
}
if(speed2<0)
{
s3=0;
s4=1;
}
}
}
voidgo_forward(uintspeed)
{
s1=1;
s2=0;
s3=1;
s4=0;
pwm1=speed;
pwm2=speed;
}
voidgo_back(uintspeed)
{
s1=0;
s2=1;
s3=0;
s4=1;
pwm1=speed;
pwm2=speed;
}
voidstop()
{
s1=1;
s2=1;
s3=1;
s4=1;
pwm1=0;
pwm2=0;
}
voidturn_right(uintP1,uintP2)//右轉函數
{
s1=1;
s2=0;
s3=0;
s4=1;
pwm1=P1;
pwm2=P2;
}
voidturn_left(uintP1,uintP2)//左轉函數
{
s1=0;
s2=1;
s3=1;
s4=0;
pwm1=P1;
pwm2=P2;
}
voidtracking()
{
if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==0))//沒有檢測到
{
go_forward(100);
}
if((LSEN1==1)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==0))//左一檢測到
{
turn_left(40,80);//左轉右輪》左輪
delay(N);
}
if((LSEN1==0)&&(LSEN2==1)&&(RSEN1==0)&&(RSEN2==0))//左二檢測到
{
turn_left(40,60);//左轉右輪》左輪
delay(N);
}
if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==1)&&(RSEN2==0))//右一檢測到
{
turn_right(60,4);//右轉左輪》右輪
delay(N);
}
if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==1))//右二檢測到
{
turn_right(80,40);//右轉左輪》右輪
delay(N);
}
if((LSEN1==1)&&(LSEN2==1))
{
turn_left(0,100);
delay(1000);
}
if((RSEN1==1)&&(RSEN2==1))
{
turn_right(100,0);
delay(1000);
}
}
voidavoidance()
{
}
voidinit()
{
TMOD=0x02;//timer0同時配置為模式2,8自動重裝計數模式
TH0=156;//定時器初輪含罩值設置100us中斷
TL0=156;
ET0=1;
EA=1;
TR0=1;//開啟總中斷
}
voidmain()
{
init();
while(1)
{
tracking();
}
}
voidtimer0()interrupt1//電機驅動提供PWM信號
{
if(t<pwm1)
en1=1;
else
en1=0;
if(t<pwm2)
en2=1;
else
en2=0;
t++;
if(t>100)
t=0;
}
(2)單片機c語言直流電機擴展閱讀
L298N是一種雙H橋電機驅動晶元,其中每個H橋可以提供2A的電流,功率部分的供電電壓范圍是2.5-48v,邏輯部分5v供電,接受5vTTL電平。一般情況下,功率部分的電壓應大於6V否則晶元可能不能正常工作。
3. 單片機控制電機正反轉動的c語言程序
首先要看你的電機是直流電機還是步進電機。直流電機就簡單了,只有兩根線,電機兩端電壓正負極改變就可以實現正轉反轉。不過要加電機驅動晶元,或者H橋電路,電機驅動晶元可以選擇L298N,加上適當的外圍電路就可以直接用單片機控制電機了。比如讓單片機P1.0 = 0,P1.1 = 1;(單片機I/0口要與電機驅動晶元的輸入腳相連)這樣的話,電機驅動晶元就會輸出一個電壓差,可以使直流電機向一個方向轉,如果使P1.0 = 1,P1.1 = 0,則電機驅動晶元會輸出一個和剛才相反的電壓,使電機向相反的方向轉動。H橋電路和電機驅動晶元的原理差不多,網上多的是。我這說的只是簡單的原理,實際中,L298N的輸入端和單片機相連的時候要加光耦隔離,否則單片機會工作不正常。步進電機就稍微復雜點,也得需要電機驅動晶元才行,只不過控制信號是按一定的規律給的,規律變了,電機轉動的方向也就變了。樓上給出的貌似是步進電機的驅動程序。
4. 52單片機實現控制直流電機調速(C語言)
pwm波,控配洞明制占空比硬體需要電機驅動晶元比如298PWM輸出腳P1.1腳:#define
out
P1^1占培告空比顫巧全局變數
unsigned
char
ZKB;
//ZKB=1~100即1%~100%void
moto_control(){unsigned
char
i;for(i=0;i<100;i++){if(i==0)out=1;if(i==ZKB)out=0;}}