单片机C语言模块化编程之双电机驱动篇Word文件下载.docx

上传人:b****6 文档编号:16545851 上传时间:2022-11-24 格式:DOCX 页数:11 大小:236.88KB
下载 相关 举报
单片机C语言模块化编程之双电机驱动篇Word文件下载.docx_第1页
第1页 / 共11页
单片机C语言模块化编程之双电机驱动篇Word文件下载.docx_第2页
第2页 / 共11页
单片机C语言模块化编程之双电机驱动篇Word文件下载.docx_第3页
第3页 / 共11页
单片机C语言模块化编程之双电机驱动篇Word文件下载.docx_第4页
第4页 / 共11页
单片机C语言模块化编程之双电机驱动篇Word文件下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

单片机C语言模块化编程之双电机驱动篇Word文件下载.docx

《单片机C语言模块化编程之双电机驱动篇Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机C语言模块化编程之双电机驱动篇Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。

单片机C语言模块化编程之双电机驱动篇Word文件下载.docx

sbitIN2=P0^1;

sbitINA=P0^4;

//电机1的使能位INA=1,电机开始工作,INA=0,电机停止工作

sbitIN3=P0^2;

//电机2的控制位IN3,IN4的值控制电机的正转,反转,停止,IN3=1,IN4=0电机正转,IN3=0,IN4=1电机反转,IN3=0,IN4=0电机停止转动;

sbitIN4=P0^3;

sbitINB=P0^5;

//电机2的使能位INB=1,电机开始工作,INB=0,电机停止工作

//此处需要注意的地方,关于模块化编程时如果用到全局变量时,全局变量要在MOTOR.C中定义,MOTOR.H中需要extern声明(不可以再次赋值可以直接尝试下),否则将会报错。

externuintspeed1,speed2;

//speed1电机速度值,t1电机一个周期的时间,PWM=speed/t;

externvoiddelay(uintxms);

//一个简短的延时函数

externvoidgo(ucharspe1,ucharspe2);

//电机加速函数,通过spe1,spe2控制电机速度

externvoidqianjin();

//电机前进函数

externvoidback();

//电机后退函数

externvoidturn_left();

//电机左转

externvoidturn_right();

//电机右转

externvoidstart();

//电机启动函数

externvoidstop();

//电机停止函数

externvoidISP_init();

//定时器初始化函数

#endif

/*motor.c*/

#include"

motor.h"

uintspeed1=0,speed2=0;

voiddelay(uintxms)//简单的延时

{

uinti;

ucharj;

for(i=xms;

i>

0;

i--)

for(j=110;

j>

j--);

}

voidgo(ucharspe1,ucharspe2)//速度调节函数0~100之间

speed1=spe1;

speed2=spe2;

voidqianjin()//电机前进函数

IN1=1;

IN2=0;

IN3=1;

IN4=0;

voidback()//电机后退函数

IN1=0;

IN2=1;

IN3=0;

IN4=1;

voidturn_left()//电机左转

go(20,80);

//此处速度可以任意调,0~100之间,左边的速度要小于右边速度值

}

voidturn_right()

{//电机右转

go(80,20);

voidstart()//开始

TR0=1;

TR1=1;

INA=1;

INB=1;

voidstop()//停止

TR0=0;

TR1=0;

INA=0;

INB=0;

voidISP_init()

TMOD=0X11;

TH0=-500/256;

TL0=-500%256;

TH1=-500/256;

TL1=-500%256;

ET0=1;

ET1=1;

EA=1;

voidTimer_0()interrupt1//通过2个定时器来实现左右2个电机占空比的输出

staticuchartemp1=0,t1=0;

if(t1==0)

{

temp1=speed1;

//每个pwm输出完成后再接受新的速度值。

}

if(t1<

=temp1)//通过定时器来实现左边电机PWM占空比的输出。

INA=1;

else

INA=0;

t1=(t1+1)%100;

voidTimer_1()interrupt3

staticuchartemp2=0,t2=0;

if(t2==0)//一个周期后才改变temp的值

temp2=speed2;

if(t2<

=temp2)//通过定时器实现右边电机PWM占空比的输出。

INB=1;

INB=0;

t2=(t2+1)%100;

/*main.c*/

sbitstart_k=P3^0;

//开始按键

sbitstop_k=P3^1;

sbitqianjin_k=P3^2;

sbitback_k=P3^3;

sbitturn_left_k=P3^4;

sbitturn_right_k=P3^5;

bits_flag=0;

//停止键按下标志位,按下停止键后再按其他的键都不起作用,直到开始键按下后恢复正常

voidkeyscan()

if(start_k==0)

delay(5);

if(start_k==0)

{

while(!

start_k);

start();

s_flag=0;

}

if(stop_k==0)

if(stop_k==0)

stop_k);

stop();

s_flag=1;

}

if(qianjin_k==0&

&

s_flag==0)

if(qianjin_k==0)

qianjin_k);

qianjin();

if(back_k==0&

if(back_k==0)

back_k);

back();

if(turn_left_k==0&

if(turn_left_k==0)

turn_left_k);

turn_left();

if(turn_right_k==0&

if(turn_right_k==0)

turn_right_k);

turn_right();

}

voidmain(void)

ISP_init();

while(start_k);

//等待直到开始键按下后电机开始工作

delay(5);

while(!

start();

qianjin();

go(80,80);

//go(80,80),控制此时电机速度,PWM=80/100;

占空比越大对应的电机速度越快

while

(1)

keyscan();

//不断扫描按键按下情况

附录:

单个直流电机驱动原理

直流电机只有2个接口,正极,负极,给这两个接口通电电机就会转动,当然电压不要太高,否则会烧坏电机。

单片机控制直流电机运转,由于单片机驱动能力有限,所以需要增加外围驱动IC,我们这里使用的L298电机专用驱动模块,一个L298电机驱动模块可以同时驱动2个电机,在智能小车上面通常都使用L298刚好可以控制2个电机,L298需要12V电压才能够驱动,这点需要注意,当然低于12V也是可以驱动的,只是驱动能力不是太强,L298上有3个引脚需要注意(这里以一个电机驱动为例);

单个电机只需要控制IN1,IN2,INA这3个引脚即可,其中IN1,IN2是控制电机转动方向的控制引脚,IN1=1,IN2=0,对应的电机就好朝一个方向转动,IN1=0,IN2=1,电机会朝令一个方向转动,当IN1=0,IN2=0是电机就停止转动。

INA电机电机使能控制引脚,当INA=1时电机可以正常使用,当INA=0时,此时电机停止工作,无论怎么控制IN1,IN2的值电机始终停止工作。

驱动部分完成后就可以同过编程控制这3个引脚来控制电机的运动状态。

电机的速度控制需要占空比PWM来控制(不知道占空比的可以XX查下)下边就是产生占空比的方法:

1.通过延时的方法来实现占空比PWM

voidtimer_0()interrupt1

TH0=-50000/256;

TL0=-50000%256;

if(flag==0)

IN1=0;

IN2=1;

pwm1=1;

delay(num);

pwm1=0;

delay(100-num);

2.通过定时器的方法实现PWM

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1