电机电流小于1a用8050和8550搭h桥是最便宜的方案,电路也非常简单,
电流小于3a可以使用l298n(l298n的原理图我这没有,你自己百度搜把),电流小于43a可以使用bts7960(这个芯片我用过,主要用于大电流直流电机驱动,挺贵的但是性能很好,学生不建议使用)
,这三种方案元件价格是由低到高的,具体哪个你自己考虑,调速都是使用pwm,
还有就是可以使用mos管搭h桥也可
#include
<AT89X51H>
#define
uchar
unsigned
char
/
TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256;
TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器
工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时
间为1ms65536=65536ms
/
#define
V_TH0
0XFF
#define
V_TL0
0XF6
#define
V_TMOD
0X01
void
init_sys(void);
/系统初始化函数/
void
Delay5Ms(void);
unsigned
char
ZKB1,ZKB2;
void
main
(void)
{
init_sys();
ZKB1=40;
/占空比初始值设定/
ZKB2=70;
/占空比初始值设定/
while(1)
{
if
(!P1_1)
//如果按了+键,增加占空比
{
Delay5Ms();
if
(!P1_1)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}
if
(!P1_2)
//如果按了-键,减少占空比
{
Delay5Ms();
if
(!P1_2)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/对占空比值限定范围/
if
(ZKB1>99)
ZKB1=1;
if
(ZKB1<1)
ZKB1=99;
}
}
/
函数功能:对系统进行初始化,包括定时器初始化和变量初始化/
void
init_sys(void)
/系统初始化函数/
{
/定时器初始化/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}
//延时
void
Delay5Ms(void)
{
unsigned
int
TempCyc
=
1000;
while(TempCyc--);
}
/中断函数/
void
timer0(void)
interrupt
1
using
2
{
static
uchar
click='0';
/中断次数计数器变量/
TH0=V_TH0;
/恢复定时器初始值/
TL0=V_TL0;
++click;
if
(click>=100)
click='0';
if
(click<=ZKB1)
/当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整/
P1_3=0;
else
P1_3=1;
if
(click<=ZKB2)
P1_4=0;
else
P1_4=1;
}只是调占空比的,希望对你有帮助,调试好的
例如,把单片机的P10和P11分别接在直流电机的两个电极上。
汇编程序:
ORG 0000H
LJMP MAIN
MAIN :
SETB P10 //反转改为:CLR P10
CLR P11 //SETB P11
SJMP $
END
C51程序:
#include"reg51h"
#define uint unsigned int
#define uchar unsigned char
sbit P10=P1^0;
sbit P11=P1^1;
void delay()
{
uint i,j;
for(i=0;i<1000;i++)
for(j=0;j<500;j++);
}
main()
{
while(1)
{
P10=1;
P11=0;
delay();
P10=0;
P11=1;
delay();
}
}
对基于MCS-51系列单片机实现直流电机调速系统进行研究和设计,能够在不同按钮的作用下分别实现电机的启动、停止、正转、反转、加速、减速控制;能够实现对直流电机的PWM的调速设计。增大占空比,增加转速,减小占空比,减小转速。
通过按键的输入,对控制器发出指令,由此来输出电机的启停、正反转、以及加减速和LED的显示。
#include"reg52h"
#include"intrinsh"
#define unint unsigned int
#define unchar unsigned char
#define PLAY_OUT P1
unchar sec=0;
unchar min=0;
unchar count=0;
bit gj=0; //光和遥控的切换
unchar r6,r7;
bit time0=1;
bit time1=1;
sbit PLAY_Q_Q=P3^0;
sbit PLAY_Z=P3^1;
sbit PLAY_Y=P3^4;
sbit PLAY_QH=P3^5;
sbit PLAY_Q_H=P3^6;
sbit PLAY_T=P3^7;
unchar r0,r1,r2=0x00,r3=0x00,r4=0x00,r5=0x00;
unchar code TAB_Q[4]={0xf9,0xf5,0xf6,0xfa};//前进
unchar code TAB_H[4]={0xfa,0xf6,0xf5,0xf9};//后退
unchar code TAB_Y[4]={0x9f,0x5f,0x6f,0xaf};//右转
unchar code TAB_Z[4]={0xaf,0x6f,0x5f,0x9f};//左转
//
void intiaton(void);
void int_time3(void);
void int_time0(void);
void fanzhuan_Y(void);
void fanzhuan_Z(void);
void zhenzhuan_Q(void);
void zhenzhuan_H(void);
void zhenzhuan_AQ(void);
void zhenzhuan_AH(void);
void cankey(void);
//
delay(unint t) //06ms
{unint i;
for(i=55;i>t;i--) ;
}
//
delayms(unint k) //k=1延迟0884毫秒
{unint i;
for(i=80;i>k;i--)
;
}
//
void delay238(void) //238ms
{
unint i,j;
for(j=125;j>0;j--)
for(i=0;i<1;i++);
}
//
void intiaton(void) //初始化
{
TMOD=0x11;
TH1=0XFA;
TL1=0X56;
ET1=1;
TR1=1;
EA=1;
}
//
void int_time3() interrupt 3 using 3
{
TH1=0XFA;
TL1=0X56;
sec++;
if(sec==2)
{
sec=0;
min++;
}
}
// //光感与按键控制
void cankey()
{
if(gj)
{
if(!PLAY_Q_Q)
{
count=1;
}
if(!PLAY_T)
{
count=2;
}
if(!PLAY_Q_H)
{
count=3;
}
}
if((PLAY_Z==0)||(PLAY_Y==0))
{
delayms(1);
if(PLAY_Z==0)
{
fanzhuan_Z();count=1;
}
else
{
fanzhuan_Y();count=1;
}
}
if(PLAY_QH==0)
{
delayms(10);
if(PLAY_QH==0)
{
count++;
if(count==4)
{
count=0;
}
}
while(PLAY_QH==0);
}
switch(count)
{
case 0: PLAY_OUT=0xff;break;
case 1: zhenzhuan_AQ();break;
case 2: PLAY_OUT=0xff;break;
case 3: zhenzhuan_AH();break;
default :break;
}
}
// //按键前进
void zhenzhuan_AQ(void)
{
for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_Q[r6];
while(sec==0);
sec=0;
}
}
// //按键后退
void zhenzhuan_AH(void)
{
for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_H[r6];
while(sec==0);
sec=0;
}
}
// //左转
void fanzhuan_Z(void)
{
unchar i;
for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Z[r7];
while(sec==0);
sec=0;
}
}
cankey();
}
// //右转
void fanzhuan_Y(void)
{
unchar i;
for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Y[r7];
while(sec==0);
sec=0;
}
}
cankey();
}
//
void main()
{
intiaton();
while(1)
{
cankey();
}
这是加了感光跟按键控制的智能小车,是读大一时候写的,现在看起来呵呵。。。垃圾代码一大堆,不过好象还可以用。
1、通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。2、当然单片机的I/O口是不能直接驱动电机的,所以你还需要用一个马达驱动芯片。像LG9110、CMO825等。马达驱动IC可以将单片机I/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。3、你要是不清除PWM是怎么回事呢,可以先作一些了解,再来知道有征对性地提问就好了。]
以上就是关于单片机到底能不能直接驱动直流电机全部的内容,包括:单片机到底能不能直接驱动直流电机、单片机C语言编程:用PWM控制直流电机转速、c51单片机直流电机正反转程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)