基于51单片机的步进电机控制性系统

发布时间:2023-02-09  

功能:

控制步进电机实现加速、减速、正转,反转,停止,并用LCD12864显示相关信息。

程序运行图:


仿真原理图:


部分程序:

#define KEY_GLOBAL 1

#include "Key.h"

static uchar keyValueBuff; //读取键值的缓冲区

static uchar keyValueOld; //前一次的键值

static uchar keyValueTemp; //键值中间交换变量

static uint stillTimes; //键按下保持次数

static uint stillTimesMax;


static uchar get_data_1_count(uchar number);

static void read_all_key(uchar *buff);

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

*函数名称:keyDelay(uint us)

*函数功能:毫秒级延时

*函数入口:延时计数变量us

*函数出口:无

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

void keyDelay(uint us)

{

uchar delayi;

while(--us)

{

for(delayi=0;delayi<10;delayi++);

}

}

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

*函数名称:key_init(void)

*函数功能:初始化按键扫描

*函数入口:无

*函数出口:无

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

void key_init(void)

{

keyValueBuff = 0x00;

keyValueOld = 0x00;

keyValueTemp = 0x00;

stillTimes = 0;

stillTimesMax = FIRST_TIMES;

}

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

*函数名称:read_all_key(uchar *buff)

*函数功能:扫描按键下的键,将按下的键的位置存入变量buff

*函数入口:buff

*函数出口:无

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


uchar get_key_value(void)

{

keyValueBuff = 0x00;

read_all_key(&keyValueBuff);

keyValueTemp = keyValueBuff;

keyDelay(KEY_DELAY_TIME);

read_all_key(&keyValueBuff);


/* 两次读到的键盘值相同 则为有效键盘值 */

if( keyValueTemp == keyValueBuff )

{


if(keyValueTemp == 0)

{

keyValueOld = 0;

stillTimes = 0;

stillTimesMax = FIRST_TIMES;

return 0;

}

else if(keyValueOld != keyValueTemp)

{

stillTimes = 0;

keyValueOld = keyValueTemp;


#if CAN_MORE_PRESS

return keyValueTemp;

#else

if( 1 == get_data_1_count(keyValueTemp) )

{

return keyValueTemp;

}

else

{

return 0;

}

#endif

}

else if(keyValueOld == keyValueTemp)

{

#if CAN_MORE_PRESS == 0

if( 1 != get_data_1_count(keyValueTemp) )

{

stillTimes = 0;

return 0;

}

#endif


#if CAN_REPEAT

stillTimes ++;

if(stillTimes > stillTimesMax)

{

stillTimes = 0;


#if REPEAT_MODE

if(FIRST_TIMES == stillTimesMax)

{

stillTimesMax = OTHER_TIMES;

}

#endif

return keyValueTemp;

}

#else

stillTimes = 0;

return 0;

#endif

}

}

else

{

stillTimes = 0;

return 0;

}

return 0;

}

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

*函数名称:get_data_1_count(uchar number)

*函数功能:计算uchar类型变量中1的数量,用于检测是否多键按下

*函数入口:number,需要检测1数量的变量

*函数出口:返回变量bumber中1的数量

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

uchar get_data_1_count(uchar number)


case MOTER_FRONT_LOWER: //正转低速运行

{

display_state(0x02);

display_speed(0x02);

break;

}

case MOTER_QUEEN_ADD: //反转加速运行

{

display_state(0x03);

display_speed(0x03);

break;

}

case MOTER_QUEEN_REDUCE: //反转减速运行

{

display_state(0x03);

display_speed(0x04);

break;

}

case MOTER_QUEEN_NOMAL: //反转正常运行

{

display_state(0x03);

display_speed(0x01);

break;

}

case MOTER_QUEEN_LOWER: //反转低速运行

{

display_state(0x03);

display_speed(0x02);

break;

}

default:

break;

}

if(moterState!=MOTER_STOP)

{

Lcd_Character_16X16(1,60,64,SPEED_STATE[6]); //运

Lcd_Character_16X16(1,60,80,SPEED_STATE[7]); //行

*实例名称:步进电机

*实例说明:实现步进电机的正反转以及加减速控制,并在LCD屏上实时

显示步进电机的状态

*作者:yd

*时间:09.06.20

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

#include "target.h"

#include "key.h"

#define MOTER_SPEED_NORMAL 10 //电机正常运行上限

#define MOTER_SPEED_MIN 25 //电机低速运行下限

uchar timer0Count; //timer0中断溢出计数

uchar moterStep; //电机步数 (0x00~0x07)

uint moterSpeed; //速度值变化量 (0~moterSpeedMax)

uint moterSpeedMax; //速度最快值

uchar moterState; //电机运行状态

uchar moterDirect; //电机运转方向,静止/0x00;正转/0x01;反转/0x02

uchar moterAddReduce; //电机加速及减速量

uchar speedDirect; //0x01,电机加速;0x02,电机减速

bit display_is_ok; //显示屏是否需要更新

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

MOTER_STOP,停止;MOTER_FRONT_ADD,正转加速

MOTER_FRONT_REDUCE,正转减速;MOTER_FRONT_NORMAL,正转正常

MOTER_FRONT_LOWER,正转低速;MOTER_QUEEN_ADD,反转加速

MOTER_QUEEN_REDUCE,反转减速,MOTER_QUEEN_NOMAL,反转正常

MOTER_QUEEN_LOWER,反转低速

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

void main()

{


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    设计所需要的各个功能。单片机端口可以控制显示模块、驱动电机模块、温度传感器模块、霍尔传感器模块以及DS1302时钟模块,还能控制各个按键的功能。设计使用单片机的P10,P11接口和直流电机驱动模块相连。使用P37......
    功率放大单元均采用场效应管自行搭建,在小功率步进电动机及直流电机驱动控制中有较强的通用性,最大驱动电流可达6A.可以不作任何的硬件改动,仅通过重写软件,就可以直接应用在其它系统中驱动直流或步进电动机。 ......
    作为控制核心,通过编程实现电动车前后行驶、左右转向、加速等操作。而驱动部分则采用L298N驱动芯片驱动直流电机。当前设计的电动车,支持锂电池供电、支持按键实现电动车前后行驶、左右转向和加速等操作,电机采用直流电机......
    这里需要上拉电阻。为了电路的简化,这里使用了排阻。数码管的位选端接单片机的P1.0~P1.3,当输出低电平时,表示该位数码管被选中。 图8数码管电路 3.3直流电机驱动电路 L298是一款高电压、高电流型的全桥驱动......
    的供电电源12V),因此设计一个降压模块,当输入电源为直流12V时,经过其模块内部的处理可以得到一个输出稳定的5V电压,这样就可以为单片机供电,其中的12V电压是为了给步进电机驱动......
    stm32单片机直流电机驱动原理分析;  stm32直流电机驱动与测速   说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然......
    .l298n电机驱动芯片x2(因为是做四轮的,所以我就用了两个驱动了,驱动效率也高一些) 5.HC-05蓝牙模块 (新手可以用hc-06,比较简单一些,因为我只有hc-05就只能用这个了) 6. 直流电机......
    电路是电子设备,如集成电路、功率 MOS 管等。该驱动方式转速范围广、效率高、噪声低。   单片机控制,怎么驱动大功率直流电机?   驱动大功率直流电机一般需要使用一些功率较大的驱动器件,例如......
    一个闭环控制电路,要求用直流电机驱动磁棒移动,控制磁棒达到设定位移,位移误差的绝对值不大于2mm。 2 方案论证 根据题目要求和本系统的设计思想,系统主要包括激励信号模块,机械传动模块,信号......
    电路。 大多数直流电机的功率要求远远超出了单片机的范围,而且在反转旋转方向时产生的电压尖峰更容易损坏单片机。因此将直流电机直接连接到单片机是不明智的,完美的解决方案是在单片机和直流电机之间使用电机驱动......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>