直流电机驱动程序

/*

用S51单片机控制驱动芯片L298驱动1路直流电机程序(C语言)

*/

#include

#define uint unsigned int

#define uchar unsigned char

#define MAX_TIMER_COUNT 0xffff //

#define TIMER_PERIOD_VALUE 0xfc18 //PWM周期,1ms

#define KEY_0 0x01 //键值

#define KEY_1 0x02

#define KEY_2 0x04

#define KEY_3 0x08

#define ForWard 0 //正向

#define Reverse 1 //反向

#define True 1

#define False 0

// 电机驱动引脚定义

sbit MA=P1^4; //

sbit MB=P1^5;

sbit MC=P1^6;

sbit MD=P1^7;

sbit LED = P0^0; //测试LED

sbit EN1_PWM = P3^5; //PWM使能输出脚

uchar STH0 = 0; //T0计数缓存

uchar STL0 = 0;

uchar STH1 = 0; //T1计数缓存

uchar STL1 = 0;

bit Breaked = False; //刹车停止标志

bit Running = False; //运行标志

bit Direction = ForWard; //方向标志

uint MaxPeriodCNT = MAX_TIMER_COUNT - TIMER_PERIOD_VALUE; //PWM周

期,1ms

//static int spcount = 0; //步进电机转速参数计数

/*********************************************************

发送数据子函数

*********************************************************/

/*void txdata(uchar dat)

{

SBUF = dat; //发送数据

while (!TI);//等待数据发送完中断

TI = 0; //清中断标志

}*/

void delay(unsigned int N)

{

int i;

for(i=0;i

}

void setMotorA_ForWard() //设为正向

{

MA = 1;

MB = 0;

Breaked = False;

Direction = ForWard; //正向标志

}

void setMotorA_Reverse() //设为反向

{

MA = 0;

MB = 1;

Breaked = False;

Direction = Reverse; //反向

}

void setMotorA_FastBreak() //快速停转

{

MA = 0;

MB = 0;

Breaked = True; //已刹车(停止)

Running = False; //电机运行停止

}

void setMotorA_FreeStop() //自由停转

{

TR0=0 ; //关定时器0

TR1=0 ; //关定时器1

EN1_PWM = 0;

Running = False; //电机运行停止

}

void setMotorA_Speed(uchar duty) //uint duty为占比值乘100后的整数

{

uint THiVot ; //

uint TLoVot ; //

uint tmp = MAX_TIMER_COUNT - MaxPeriodCNT * (double)(duty / 100.0);

THiVot = TIMER_PERIOD_VALUE; //这里计算PWM占空比对应的高电平 if (tmp > THiVot) //高电平时间计数要比周期值计数值大 {

TLoVot = tmp; //这里计算PWM占空比对应的高电平 }

//setMotorA_FreeStop();

//高电时间

STH0 = THiVot/256;

STL0 = THiVot%256;

//低电时间

STH1 = TLoVot/256;

STL1 = TLoVot%256;

TR0=1;

}

void setMotorA_Start() //启动直流电机

{

if (Breaked) //已快速制动(刹车)

{

setMotorA_Reverse();

}

Breaked = False;

TR1=0 ; //关定时器1

TH0 = STH0;

TL0 = STL0; //重新加载定时器0初值

TR0=1;

TR0=1 ; //开定时器0

Running = True; //已运行

}

void system_init(void )

{

TMOD=0x11;

EA=1; //全局中断开

ET0=1; //ET0 : T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0禁止T0中断。

ET1=1; //ET1 : 定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。

setMotorA_FreeStop(); //开机停转

}

/*********************************************************/

// 定时器0中断服务程序.作为PWM周期定时

/*********************************************************/

void timer0() interrupt 1

{

//TR0 = 0 ; //关定时器0

TH0 = STH0; //把新的脉宽值给定时器1

TL0 = STL0; //把新的脉宽值给定时器1

//TR0 = 1 ; //开定时器0

EN1_PWM = 1; //PWM输出高电平

TH1 = STH1; //把新的脉宽值给定时器1

TL1 = STL1; //把新的脉宽值给定时器1

TR1 = 1 ; //开定时器1

}

/*********************************************************/

// 定时器1中断服务程序.作为PWM高电平定时

/*********************************************************/

void timer1() interrupt 3

{

TR1=0; //关定时器1

EN1_PWM = 0; //PWM输出低电平

//TH0 = STH0;

//TL0 = STL0; //重新加载定时器0初值

//TR0=1;

}

/**************************************************************** the function: 转换键值,将硬件键值转换成逻辑键值。

*****************************************************************/ uchar getKeyValue(uchar i)

{

uchar keyvalue = 0xff;

switch(i)

{

case KEY_0: keyvalue = 0x00; break;

case KEY_1: keyvalue = 0x01; break;

case KEY_2: keyvalue = 0x02; break;

case KEY_3: keyvalue = 0x03; break;

default : keyvalue = 0xff;

}

return keyvalue;

}

/**************************************************************** the function:独立键盘,由于本版开发板删除了矩阵键盘,

只保4个独立键盘,所以本实验仅作为原理演示之用。

*****************************************************************/ uchar checkInput(void)

{

P1 |= 0x0f;

return ~(P1 | 0xf0); //取反键值,方便键值 }

void main(void)

{

uchar i = 0;

uchar duty = 10; //占空比值

uchar preKey = 0xff; //前一时刻的键值

system_init(); //初始化

setMotorA_ForWard(); while(1) { i = checkInput(); //设为正转方向 i = getKeyValue(i); if (preKey == 0xff) //有按键 { switch(i) { case 0: if (duty0) //占空比大于0 { duty-=5; } setMotorA_Speed(duty); break; case 2: if (Direction == ForWard) //更改方向 { setMotorA_Reverse(); } else { setMotorA_ForWard(); } break; case 3: if (!Running) //更改运行状态 { setMotorA_Start(); } else { setMotorA_FreeStop(); } break;

} } } P0 = duty; //LED = Direction; preKey = i; delay(100); //输出占空比值 //保存键值

/*

用S51单片机控制驱动芯片L298驱动1路直流电机程序(C语言)

*/

#include

#define uint unsigned int

#define uchar unsigned char

#define MAX_TIMER_COUNT 0xffff //

#define TIMER_PERIOD_VALUE 0xfc18 //PWM周期,1ms

#define KEY_0 0x01 //键值

#define KEY_1 0x02

#define KEY_2 0x04

#define KEY_3 0x08

#define ForWard 0 //正向

#define Reverse 1 //反向

#define True 1

#define False 0

// 电机驱动引脚定义

sbit MA=P1^4; //

sbit MB=P1^5;

sbit MC=P1^6;

sbit MD=P1^7;

sbit LED = P0^0; //测试LED

sbit EN1_PWM = P3^5; //PWM使能输出脚

uchar STH0 = 0; //T0计数缓存

uchar STL0 = 0;

uchar STH1 = 0; //T1计数缓存

uchar STL1 = 0;

bit Breaked = False; //刹车停止标志

bit Running = False; //运行标志

bit Direction = ForWard; //方向标志

uint MaxPeriodCNT = MAX_TIMER_COUNT - TIMER_PERIOD_VALUE; //PWM周

期,1ms

//static int spcount = 0; //步进电机转速参数计数

/*********************************************************

发送数据子函数

*********************************************************/

/*void txdata(uchar dat)

{

SBUF = dat; //发送数据

while (!TI);//等待数据发送完中断

TI = 0; //清中断标志

}*/

void delay(unsigned int N)

{

int i;

for(i=0;i

}

void setMotorA_ForWard() //设为正向

{

MA = 1;

MB = 0;

Breaked = False;

Direction = ForWard; //正向标志

}

void setMotorA_Reverse() //设为反向

{

MA = 0;

MB = 1;

Breaked = False;

Direction = Reverse; //反向

}

void setMotorA_FastBreak() //快速停转

{

MA = 0;

MB = 0;

Breaked = True; //已刹车(停止)

Running = False; //电机运行停止

}

void setMotorA_FreeStop() //自由停转

{

TR0=0 ; //关定时器0

TR1=0 ; //关定时器1

EN1_PWM = 0;

Running = False; //电机运行停止

}

void setMotorA_Speed(uchar duty) //uint duty为占比值乘100后的整数

{

uint THiVot ; //

uint TLoVot ; //

uint tmp = MAX_TIMER_COUNT - MaxPeriodCNT * (double)(duty / 100.0);

THiVot = TIMER_PERIOD_VALUE; //这里计算PWM占空比对应的高电平 if (tmp > THiVot) //高电平时间计数要比周期值计数值大 {

TLoVot = tmp; //这里计算PWM占空比对应的高电平 }

//setMotorA_FreeStop();

//高电时间

STH0 = THiVot/256;

STL0 = THiVot%256;

//低电时间

STH1 = TLoVot/256;

STL1 = TLoVot%256;

TR0=1;

}

void setMotorA_Start() //启动直流电机

{

if (Breaked) //已快速制动(刹车)

{

setMotorA_Reverse();

}

Breaked = False;

TR1=0 ; //关定时器1

TH0 = STH0;

TL0 = STL0; //重新加载定时器0初值

TR0=1;

TR0=1 ; //开定时器0

Running = True; //已运行

}

void system_init(void )

{

TMOD=0x11;

EA=1; //全局中断开

ET0=1; //ET0 : T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0禁止T0中断。

ET1=1; //ET1 : 定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。

setMotorA_FreeStop(); //开机停转

}

/*********************************************************/

// 定时器0中断服务程序.作为PWM周期定时

/*********************************************************/

void timer0() interrupt 1

{

//TR0 = 0 ; //关定时器0

TH0 = STH0; //把新的脉宽值给定时器1

TL0 = STL0; //把新的脉宽值给定时器1

//TR0 = 1 ; //开定时器0

EN1_PWM = 1; //PWM输出高电平

TH1 = STH1; //把新的脉宽值给定时器1

TL1 = STL1; //把新的脉宽值给定时器1

TR1 = 1 ; //开定时器1

}

/*********************************************************/

// 定时器1中断服务程序.作为PWM高电平定时

/*********************************************************/

void timer1() interrupt 3

{

TR1=0; //关定时器1

EN1_PWM = 0; //PWM输出低电平

//TH0 = STH0;

//TL0 = STL0; //重新加载定时器0初值

//TR0=1;

}

/**************************************************************** the function: 转换键值,将硬件键值转换成逻辑键值。

*****************************************************************/ uchar getKeyValue(uchar i)

{

uchar keyvalue = 0xff;

switch(i)

{

case KEY_0: keyvalue = 0x00; break;

case KEY_1: keyvalue = 0x01; break;

case KEY_2: keyvalue = 0x02; break;

case KEY_3: keyvalue = 0x03; break;

default : keyvalue = 0xff;

}

return keyvalue;

}

/**************************************************************** the function:独立键盘,由于本版开发板删除了矩阵键盘,

只保4个独立键盘,所以本实验仅作为原理演示之用。

*****************************************************************/ uchar checkInput(void)

{

P1 |= 0x0f;

return ~(P1 | 0xf0); //取反键值,方便键值 }

void main(void)

{

uchar i = 0;

uchar duty = 10; //占空比值

uchar preKey = 0xff; //前一时刻的键值

system_init(); //初始化

setMotorA_ForWard(); while(1) { i = checkInput(); //设为正转方向 i = getKeyValue(i); if (preKey == 0xff) //有按键 { switch(i) { case 0: if (duty0) //占空比大于0 { duty-=5; } setMotorA_Speed(duty); break; case 2: if (Direction == ForWard) //更改方向 { setMotorA_Reverse(); } else { setMotorA_ForWard(); } break; case 3: if (!Running) //更改运行状态 { setMotorA_Start(); } else { setMotorA_FreeStop(); } break;

} } } P0 = duty; //LED = Direction; preKey = i; delay(100); //输出占空比值 //保存键值


相关内容

  • 无刷直流电机原理结构
  • 目 录 第1章 无刷直流电机的原理与驱动···············································································1 1.1 让你的BLDC-DK615迅速跑起来··························· ...

  • 51单片机驱动 步进电机
  • 编号: 基于MCS-51单片机的步进电机驱动器2008年03月10日 院(系) 姓名 论文(设计)题目机电工程系张恒凯专业学号自动化[1**********]6基于MCS-51单片机的步进电机控制器 一.选题目的和意义 步进电机是电机家族中近年来发展较快.具有广阔应用前景的重要一员,它能将输入的电脉 ...

  • 百格拉步进电机
  • 德国百格拉公司 德国百格拉公司1934年以来一直致力于步进电机和伺服电机的研究.开发.生产工作.是世界上步进驱动系统行业的领导者. 该公司于1973年发明了五相混合式步进电机及其驱动器,克服了两相步进电机振动噪音大.只能用于简单应用场合的缺点,因此可胜任更高要求的任务,适合进行微步控制,并逐渐成为世 ...

  • [005-3]新能源电动汽车用轮毂电机关键技术综述
  • 新能源电动汽车用轮毂电机关键技术综述黄书荣  邢栋  徐伟[摘要]本文首先介绍了轮毂电机驱动电动汽车与传统结构电动车的异同点,总结出关键技术的优缺点.然后,论文着重论述了不同种类轮毂电机的技术特点.发展现状.存在问题等.最后,文章分析和预测了未来轮毂电机的发展趋势和潜在的市场价值.[关键词]电动汽车 ...

  • 大总结L298N的详细资料驱动直流电机和步进电机
  • 大总结 L298N 的详细资料驱动直流电机和步进电机 电机驱动电路:电机转速控制电路(PWM 信号) 主要采用L298N ,通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作,输入引脚与输出引脚的逻辑关系图为 驱动原理图 ------------------------- ...

  • 研控步进电机及驱动器适配表
  • 研控步进电机及驱动器适配表 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角.这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点.使得在 ...

  • 直流电机转速控制方案
  • 直流电机控制系统 SPCE061A应用方案 V1.0 – 2005.11.30 凌阳科技大学计划教育推广中心 北京海淀上地信息产业基地中黎科技园1号楼3层 TEL: 010-62981113 FAX: 010-62986660-2992 E-mail:[email protected] http ...

  • 如何正确选择伺服电机和步进电机
  • 如何正确选择伺服电机和步进电机正确选择伺服电机 1. 如何正确选择伺服电机和步进电机? 2. 主要视具体应用情况而定,简单地说要确定:负载的性质(如水平还是垂直 负载等),转矩.惯量.转速.精度.加减速等要求,上位控制要求(如对端口界面和通讯方面的要求),主要控制方式是位置.转矩还是速度方式.供电电 ...

  • BLDC直流无刷电机驱动
  • 目 录 第1章 无刷直流电机驱动实验指导···············································································2 1.1 1.2 1.3 1.4 1.5 概述··························· ...

  • 步进电机说明书
  • 目录 1.课程设计任务书-----------------------3 2.说明书的正文------------------------4 2.1步进电机概述-----------------------4 2.2步进电机工作原理简要说明-----------------4 2.3驱动器介绍--- ...