直流电机
原理:链接
转速:脉冲宽度调制(Pulse width modulation,PWM)
周期(频率)、占空比
电机驱动电路
代码编写
按键控制直流电机速度
main.c
#include "main.h"
#include "delay.h"
int count = 0,level = 7;
void main()
{
TR0 = 1;
TH0 = 0xDC;
TL0 = 0x00;
TMOD = 0x01;
ET0 = 1;
EA =1;
while(1)
{
if(KEY1 == 0)
{
Delay120ms();
if(KEY1 == 0)
{
level++;
level = level % 10; //到10才清理
}
}
}
}
mian.h
#ifndef __MAIN_H__
#define __MAIN_H__
#include "reg52.h"
//定义LED、按键
sbit LED1 = P1^0;
sbit KEY1 = P3^2;
extern char count,level;
#endif
time.c
#include "main.h"
//定时中断
Timer0_Routine(void) interrupt 1
{
TH0 = 0xDC;
TL0 = 0x00;
count++; //每次定时中断加1
if(count > level) //level越大,占空比越小速度越慢
LED1 = 1;
else
LED1 = 0;
count = count % 10; //到10清零
}
delay.c
#include "delay.h"
//延时函数
void Delay120ms() //@11.0592MHz
{
unsigned char data i, j;
i = 216;
j = 37;
do
{
while (--j);
} while (--i);
}
delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay120ms();
#endif
练习:直流电机与iic通信连接oled屏,显示电机转速等级数字
进步电机
原理:链接
代码编写
main.c
#include "main.h"
#include "delay.h"
int x,y;
uchar phasecw[4] ={0x08,0x04,0x02,0x01}; //正向,四相电机对应四相通电
uchar phaseccw[4]={0x01,0x02,0x04,0x08}; //方向
void main(void)
{
for(x = 0;x < 100;x++)
{
for(y = 0;y < 4;y++) //四相通电转的角度
{
P2 = phasecw[y]; //电机连接P2口(低四位)
Delay5ms();
}
}
while(1);
}
main.h
#ifndef __MAIN_H__
#define __MAIN_H__
#include "reg52.h"
typedef unsigned char uchar;
#endif
delay.c
#include "delay.h"
void Delay5ms() //@11.0592MHz
{
unsigned char data i, j;
i = 9;
j = 244;
do
{
while (--j);
} while (--i);
}
delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay5ms();
#endif
练习:OLED屏显示步进电机前进还是后退(前进1,后退0),按键控制步进电机前进还是后退
舵机控制
角度:180/360度(这里舵机180度)
模型图:
信号说明:
舵机脉冲周期:20ms
代码编写
舵机180度控制旋转
main.c
#include "main.h"
#include "delay.h"
int level = 0,count = 0;
void main()
{
TR0 = 1;
//定时器时间:0.5ms
TMOD |= 0x01;
TL0 = 0x33;
TH0 = 0xFE;
ET0 = 1;
EA = 1;
while(1)
{
if(KEY1 == 0)
{
Delay120ms();
if(KEY1 == 0)
{
level++;
level = level % 6;
}
}
}
}
Timer0_Routine(void) interrupt 1
{
TL0 = 0x33;
TH0 = 0xFE;
/*
level为1时,脉冲为1,持续时间0.5ms,转动角度为0,但按键延迟120ms,早过一个周期,
则下次按键时count为0,则持续时间为1ms,转动角度为45,以此类推,下次转动90,
但上一次已经转了45,所以实际再转45就到90度,当到达180度时,level为1时,转动0度,
相当于回到原点
*/
if(count < level)
SG90_PWM = 1;
else
SG90_PWM = 0;
count++;
//周期20ms,0.5ms一次定时中断触发,40次则20ms
if(count > 40)
count = 0;
}
main.h
#ifndef __MAIN_H__
#define __MAIN_H__
#include <reg52.h>
sbit SG90_PWM = P2^0;
sbit KEY1 = P3^2;
#endif
delay.c
#include "delay.h"
void Delay120ms() //@11.0592MHz
{
unsigned char data i, j;
i = 216;
j = 37;
do
{
while (--j);
} while (--i);
}
delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay120ms();
#endif
练习:OLED屏显示数字代表舵机旋转角度,按键控制舵机角度