单片机到底能不能直接驱动直流电机

单片机到底能不能直接驱动直流电机,第1张

电机电流小于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单片机直流电机正反转程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9304070.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存