17 直流电机实验
17.1 直流电机介绍
ULN2003 是一个单片高电压、高电流的达林顿晶体管阵列集成电路。它是由7 对NPN 达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。
17.2 硬件设计
17.3 软件设计
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit DC_Motor=P1^0;
#define DC_MOTOR_RUN_TIME 5000
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
DC_Motor=1;
delay_ms(DC_MOTOR_RUN_TIME);
DC_Motor=0;
while(1)
{
}
}
18 步进电机实验
了解步进电机的结构、工作原理、电机参数。学会调节电机旋转方向、旋转速度(加速、减速)。
18.1 直流电机介绍
18.2 硬件设计
18.3 软件设计
/**************************************************************************************
ÉîÛÚÊÐÆÕÖпƼ¼ÓÐÏÞ¹«Ë¾£¨PRECHIN ÆÕÖУ©
¼¼ÊõÖ§³Ö£ºwww.prechin.net
ʵÑéÃû³Æ£º²½½øµç»úʵÑé
½ÓÏß˵Ã÷£º
ʵÑéÏÖÏó£ºÏÂÔسÌÐòºó£¬µ±°´ÏÂKEY1¼ü¿Éµ÷½Úµç»úÐýת·½Ïò£»µ±°´ÏÂKEY2¼ü£¬µç»ú¼ÓËÙ£»
µ±°´ÏÂKEY3¼ü£¬µç»ú¼õËÙ
×¢ÒâÊÂÏ½«²½½øµç»úºìÉ«Ï߶Խӵ½¡°²½½øµç»úÄ£¿é¡±Êä³ö¶Ë×ÓJ47µÄ5VÉÏ£¬ÆäËüÏàÐòÒÀ´Î½ÓÈë¡£
***************************************************************************************/
#include "reg52.h"
typedef unsigned int u16; //¶ÔϵͳĬÈÏÊý¾ÝÀàÐͽøÐÐÖض¨Òå
typedef unsigned char u8;
//¶¨ÒåULN2003¿ØÖƲ½½øµç»ú¹Ü½Å
sbit IN1_A=P1^0;
sbit IN2_B=P1^1;
sbit IN3_C=P1^2;
sbit IN4_D=P1^3;
//¶¨Òå¶ÀÁ¢°´¼ü¿ØÖƽÅ
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
//ʹÓú궨Òå¶ÀÁ¢°´¼ü°´ÏµļüÖµ
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
// ¶¨Òå²½½øµç»úËٶȣ¬ÖµÔ½Ð¡£¬ËÙ¶ÈÔ½¿ì
// ×îС²»ÄÜСÓÚ1
#define STEPMOTOR_MAXSPEED 1
#define STEPMOTOR_MINSPEED 5
/*******************************************************************************
* º¯ Êý Ãû : delay_10us
* º¯Êý¹¦ÄÜ : ÑÓʱº¯Êý£¬ten_us=1ʱ£¬´óÔ¼ÑÓʱ10us
* Êä Èë : ten_us
* Êä ³ö : ÎÞ
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* º¯ Êý Ãû : delay_ms
* º¯Êý¹¦ÄÜ : msÑÓʱº¯Êý£¬ms=1ʱ£¬´óÔ¼ÑÓʱ1ms
* Êä Èë : ten_us
* Êä ³ö : ÎÞ
*******************************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************************
* º¯ Êý Ãû : step_motor_28BYJ48_send_pulse
* º¯Êý¹¦ÄÜ : Êä³öÒ»¸öÊý¾Ý¸øULN2003´Ó¶øʵÏÖÏò²½½øµç»ú·¢ËÍÒ»¸öÂö³å
* Êä Èë : step£ºÖ¸¶¨²½½øÐòºÅ£¬¿ÉÑ¡Öµ0~7
dir£º·½ÏòÑ¡Ôñ,1£ºË³Ê±Õë,0£ºÄæʱÕë
* Êä ³ö : ÎÞ
*******************************************************************************/
void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
u8 temp=step;
if(dir==0) //Èç¹ûΪÄæʱÕëÐýת
temp=7-step;//µ÷»»½ÚÅÄÐźÅ
switch(temp)//8¸ö½ÚÅÄ¿ØÖÆ£ºA->AB->B->BC->C->CD->D->DA
{
case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//Í£Ö¹ÏàÐò
}
}
/*******************************************************************************
* º¯ Êý Ãû : key_scan
* º¯Êý¹¦ÄÜ : ¼ì²â¶ÀÁ¢°´¼üÊÇ·ñ°´Ï£¬°´ÏÂÔò·µ»Ø¶ÔÓ¦¼üÖµ
* Êä Èë : mode=0£ºµ¥´ÎɨÃè°´¼ü
mode=1£ºÁ¬ÐøɨÃè°´¼ü
* Êä ³ö : KEY1_PRESS£ºK1°´ÏÂ
KEY2_PRESS£ºK2°´ÏÂ
KEY3_PRESS£ºK3°´ÏÂ
KEY4_PRESS£ºK4°´ÏÂ
KEY_UNPRESS£ºÎ´Óа´¼ü°´ÏÂ
*******************************************************************************/
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)key=1;//Á¬ÐøɨÃè°´¼ü
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//ÈÎÒâ°´¼ü°´ÏÂ
{
delay_10us(1000);//Ïû¶¶
key=0;
if(KEY1==0)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
else if(KEY3==0)
return KEY3_PRESS;
else if(KEY4==0)
return KEY4_PRESS;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //ÎÞ°´¼ü°´ÏÂ
{
key=1;
}
return KEY_UNPRESS;
}
/*******************************************************************************
* º¯ Êý Ãû : main
* º¯Êý¹¦ÄÜ : Ö÷º¯Êý
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
void main()
{
u8 key=0;
u8 dir=0;//ĬÈÏÄæʱÕë·½Ïò
u8 speed=STEPMOTOR_MAXSPEED;//ĬÈÏ×î´óËÙ¶ÈÐýת
u8 step=0;
while(1)
{
key=key_scan(0);
if(key==KEY1_PRESS)//»»Ïò
{
dir=!dir;
}
else if(key==KEY2_PRESS)//¼ÓËÙ
{
if(speed>STEPMOTOR_MAXSPEED)
speed-=1;
}
else if(key==KEY3_PRESS)//¼õËÙ
{
if(speed<STEPMOTOR_MINSPEED)
speed+=1;
}
step_motor_28BYJ48_send_pulse(step++,dir);
if(step==8)step=0;
delay_ms(speed);
}
}