单片机C语言模块化编程之双电机驱动篇

上传人:博****1 文档编号:431544843 上传时间:2023-05-15 格式:DOC 页数:10 大小:370KB
返回 下载 相关 举报
单片机C语言模块化编程之双电机驱动篇_第1页
第1页 / 共10页
单片机C语言模块化编程之双电机驱动篇_第2页
第2页 / 共10页
单片机C语言模块化编程之双电机驱动篇_第3页
第3页 / 共10页
单片机C语言模块化编程之双电机驱动篇_第4页
第4页 / 共10页
单片机C语言模块化编程之双电机驱动篇_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《单片机C语言模块化编程之双电机驱动篇》由会员分享,可在线阅读,更多相关《单片机C语言模块化编程之双电机驱动篇(10页珍藏版)》请在金锄头文库上搜索。

1、单片机C语言模块化编程之双电机驱动篇基于PROTEUS电路仿真;电机通过L298电机驱动模块驱动;通过双定时器完美生成PWM占空比控制电机速度,也可以单独使用一个定时器驱动双电机,方法一样;通过按键扫描的方式控制电机的运动状态前进,后退,开始,停止,左拐,右拐等操作;通过查看此文档,可以让初学者对程序模块化有一个初步认识,对电机驱动原理有一个初步了解。注:在真实遥控小车中能够正常运转,速度可以任意调节通过go(uchar sped1,uchar sped2)Proteus 仿真图如下:C语言代码实现:/*motor.h*/#ifndef _MOTOR_H_#define _MOTOR_H_#i

2、nclude #define uint unsigned int#define uchar unsigned char/ 电机控制位sbit IN1=P00; /电机1的控制位 IN1,IN2的值控制电机的正转,反转,停止,IN1=1,IN2=0电机正转,IN1=0,IN2=1电机反转,IN1=0,IN2=0电机停止转动;sbit IN2=P01;sbit INA=P04; / 电机1的使能位 INA=1,电机开始工作,INA=0,电机停止工作sbit IN3=P02; /电机2的控制位 IN3,IN4的值控制电机的正转,反转,停止,IN3=1,IN4=0电机正转,IN3=0,IN4=1电机反

3、转,IN3=0,IN4=0电机停止转动;sbit IN4=P03;sbit INB=P05; / 电机2的使能位 INB=1,电机开始工作,INB=0,电机停止工作/此处需要注意的地方,关于模块化编程时如果用到全局变量时,全局变量要在MOTOR.C 中定义,MOTOR.H中需要extern声明(不可以再次赋值可以直接尝试下),否则将会报错。extern uint speed1,speed2;/ speed1电机速度值,t1电机一个周期的时间,PWM=speed/t;extern void delay(uint xms); /一个简短的延时函数extern void go(uchar spe1,

4、uchar spe2); /电机加速函数,通过spe1,spe2控制电机速度extern void qianjin(); /电机前进函数extern void back(); /电机后退函数extern void turn_left(); /电机左转extern void turn_right(); /电机右转extern void start(); /电机启动函数extern void stop(); /电机停止函数extern void ISP_init(); /定时器初始化函数#endif/*motor.c*/#include motor.huint speed1=0,speed2=0;

5、void delay(uint xms)/简单的延时 uint i; uchar j; for(i=xms;i0;i-) for(j=110;j0;j-);void go(uchar spe1,uchar spe2) /速度调节函数0100之间speed1=spe1;speed2=spe2;void qianjin()/电机前进函数IN1=1;IN2=0;IN3=1;IN4=0;void back() /电机后退函数IN1=0;IN2=1;IN3=0;IN4=1; void turn_left() /电机左转go(20,80); /此处速度可以任意调,0100之间,左边的速度要小于右边速度值

6、void turn_right()/ 电机右转go(80,20);void start() /开始TR0=1;TR1=1;INA=1;INB=1;void stop() /停止TR0=0;TR1=0; INA=0;INB=0;void ISP_init()TMOD=0X11;TH0=-500/256;TL0=-500%256;TH1=-500/256;TL1=-500%256;ET0=1;ET1=1;EA=1;void Timer_0() interrupt 1 /通过2个定时器来实现左右2个电机占空比的输出static uchar temp1=0,t1=0;TH0=-500/256;TL0=

7、-500%256;if(t1=0)temp1=speed1;/每个pwm输出完成后再接受新的速度值。if(t1=temp1) /通过定时器来实现左边电机PWM占空比的输出。 INA=1;else INA=0;t1=(t1+1)%100;void Timer_1() interrupt 3static uchar temp2=0,t2=0;TH1=-500/256;TL1=-500%256;if(t2=0) /一个周期后才改变temp的值temp2=speed2;if(t2=temp2) /通过定时器实现右边电机PWM占空比的输出。INB=1;else INB=0;t2=(t2+1)%100;/

8、*main.c*/#include motor.hsbit start_k=P30; /开始按键sbit stop_k=P31;sbit qianjin_k=P32;sbit back_k=P33;sbit turn_left_k=P34;sbit turn_right_k=P35; bit s_flag=0; /停止键按下标志位,按下停止键后再按其他的键都不起作用,直到开始键按下后恢复正常void keyscan()if(start_k=0)delay(5);if(start_k=0)while(!start_k);start();s_flag=0;if(stop_k=0)delay(5);

9、if(stop_k=0)while(!stop_k);stop();s_flag=1;if(qianjin_k=0&s_flag=0)delay(5);if(qianjin_k=0)while(!qianjin_k);qianjin();if(back_k=0&s_flag=0)delay(5);if(back_k=0)while(!back_k);back();if(turn_left_k=0&s_flag=0)delay(5);if(turn_left_k=0)while(!turn_left_k);turn_left();if(turn_right_k=0&s_flag=0)delay(

10、5);if(turn_right_k=0)while(!turn_right_k);turn_right();void main(void)ISP_init();while(start_k); /等待直到开始键按下后电机开始工作delay(5);while(!start_k);start();qianjin();go(80,80); /go(80,80),控制此时电机速度,PWM=80/100; 占空比越大对应的电机速度越快while(1)keyscan();/不断扫描按键按下情况附录:单个直流电机驱动原理直流电机只有2个接口,正极,负极,给这两个接口通电电机就会转动,当然电压不要太高,否则会

11、烧坏电机。单片机控制直流电机运转,由于单片机驱动能力有限,所以需要增加外围驱动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,

12、IN2=0是电机就停止转动。INA 电机电机使能控制引脚,当INA=1 时电机可以正常使用,当INA=0时,此时电机停止工作,无论怎么控制IN1,IN2的值电机始终停止工作。驱动部分完成后就可以同过编程控制这3个引脚来控制电机的运动状态。电机的速度控制需要占空比PWM来控制(不知道占空比的可以百度查下)下边就是产生占空比的方法:1. 通过延时的方法来实现占空比PWMvoid timer_0() interrupt 1 TH0=-50000/256; TL0=-50000%256; if(flag=0) IN1=1;IN2=0; else IN1=0;IN2=1; pwm1=1; delay(num); pwm1=0; delay(100-num);2. 通过定时器的方法实现PWMvoid Timer_0() interrupt 1 /通过2个定时器来实现左右2个电机占空比的输出static uchar temp1=0,t1=0;TH0=-500/256;TL0=-500%256;if(t1=0)temp1=speed1;/每个pwm输出完成后再接受新的速度值。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号