如何使用单片机控制直流电机呢?
真正控制之前我们要知道以下三点:
1、直流电机的控制是通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低。
2、单片机的I/O口是不能直接驱动电机的,所以你还需要用一个驱动芯片。像 LG9110、CMO825 L298 等。驱动芯片可以将单片机I/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。本文采用的是 L298。
3、为了实现调节转速功能必须来个滑动变阻器和数模转化器ADC0831, 同时使用开关控制电机正反转。
开始行动~
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit CS = P3^0;
sbit CLK = P3^1;
sbit DO = P3^6;
sbit sw = P3^7; //定义正反转开关
sbit s0 = P2^0;
sbit s1 = P2^1;
sbit ENA = P2^4;
int total = 256;
void delay(int time){
int i;
for(i = 0;i < time;i++){
//...
}
}
void Move(int time){
ENA = 1;
delay(time);
ENA = 0;
delay(total - time);
}
int readData(){
int temp = 0;
int i;
DO = 1;
_nop_();
_nop_();
CS = 0;
_nop_();
_nop_();
CLK =0;
_nop_();
_nop_();
CLK =1;
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
CLK = 1;
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
for(i = 0;i < 8;i++){
CLK = 1;
_nop_();
_nop_();
temp <<= 1;
if(DO){
temp ++;
}
CLK = 0;
_nop_();
_nop_();
}
CS = 1;
_nop_();
_nop_();
return temp;
}
void main(){
int state = sw;
int time = 0;
while(1){
state = sw;
if(state){
s0 = 0;s1 = 1;//正转
}
else{
s0 = 1;s1 = 0;//反转
}
time = readData();
Move(time);
}
}
OK 一切就绪