8.电机控制

直流电机

原理:

转速:脉冲宽度调制(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度)

模型图:
展示接线图

信号说明:
信号使用说明

代码编写

舵机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屏显示数字代表舵机旋转角度,按键控制舵机角度

演示:

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星仔_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值