51单片机实现矩阵键盘的组合按键触发

发布者:MysticalSoul最新更新时间:2022-01-27 来源: eefocus关键字:51单片机  矩阵键盘 手机看文章 扫描二维码
随时随地手机看文章

一、使用proteus绘制简单的电路图,用于后续仿真

二、编写程序


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

---- @Project: Matrix-KEY

---- @File: main.c

---- @Edit: ZHQ

---- @Version: V1.0

---- @CreationTime: 20200514

---- @ModifiedTime: 20200514

---- @Description: 16个按键中,每按一个按键都能触发一次蜂鸣器发出“滴”的一声。在同时按下S1和S16按键时,将会点亮一个LED灯。在同时按下S4和S13按键时,将会熄灭一个LED灯。

---- 单片机:AT89C52

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

#include "reg52.h"

/*——————宏定义——————*/

#define FOSC 11059200L

#define T1MS (65536-FOSC/12/1000)   /*1ms timer calculation method in 12Tmode*/

 

#define const_voice_short  80   /*蜂鸣器短叫的持续时间*/

 

/* 

*  注意:组合按键的去抖动延时const_key_time_comb千万不能等于单击按键

*  的去抖动延时const_key_time,否则组合按键会覆盖单击按键的触发。

*/

#define const_key_time  24    /*按键去抖动延时的时间*/

#define const_key_time_comb  28    /*组合按键去抖动延时的时间*/

/*——————变量函数定义及声明——————*/

/*行*/

sbit Key1 = P0^0; /*第一行输入*/

sbit Key2 = P0^1; /*第二行输入*/

sbit Key3 = P0^2; /*第三行输入*/

sbit Key4 = P0^3; /*第四行输入*/

 

/*列*/

sbit Key5 = P0^4; /*第一列输入*/

sbit Key6 = P0^5; /*第二列输入*/

sbit Key7 = P0^6; /*第三列输入*/

sbit Key8 = P0^7; /*第四列输入*/

 

/*定义蜂鸣器*/

sbit BUZZER = P2^7;

 

/*LED灯*/

sbit LED = P3^5;

 

unsigned char ucKeyStep = 1;   /*按键扫描步骤变量*/

 

unsigned char ucKeySec = 0;   /*被触发的按键编号*/

 

unsigned int  uiKeyTimeCnt[16] = 0; /*16个按键去抖动延时计数器*/

unsigned char ucKeyLock[16] = 0; /*16按键触发后自锁的变量标志*/

 

unsigned int  uiKeyTimeCnt_01_16 = 0; /*S1和S16组合按键去抖动延时计数器*/

unsigned char ucKeyLock_01_16 = 0; /*S1和S16组合按键触发后自锁的变量标志*/

 

unsigned int  uiKeyTimeCnt_04_13 = 0; /*S4和S13组合按键去抖动延时计数器*/

unsigned char ucKeyLock_04_13 = 0; /*S4和S13组合按键触发后自锁的变量标志*/

 

unsigned char ucRowRecord = 1; /*记录当前扫描到第几列了*/

 

unsigned int  uiVoiceCnt = 0;  /*蜂鸣器鸣叫的持续时间计数器*/

 

unsigned int uiKeyStatus = 0xffff; /*此变量每一位代表一个按键的状态,共16个按键。1代表没有被按下,0代表被按下。*/

 

/**

* @brief  定时器0初始化函数

* @param  无

* @retval 初始化T0

**/

void Init_T0(void)

{

TMOD = 0x01;                    /*set timer0 as mode1 (16-bit)*/

TL0 = T1MS;                     /*initial timer0 low byte*/

TH0 = T1MS >> 8;                /*initial timer0 high byte*/

}

/**

* @brief  外围初始化函数

* @param  无

* @retval 初始化外围

**/

void Init_Peripheral(void)

{

ET0 = 1;/*允许定时中断*/

TR0 = 1;/*启动定时中断*/

EA = 1;/*开总中断*/

 

}

 

/**

* @brief  初始化函数

* @param  无

* @retval 初始化单片机

**/

void Init(void)

{

BUZZER = 1;

LED = 0;

Init_T0();

}

/**

* @brief  扫描按键函数

* @param  无

* @retval 详细过程:

*  第一步:先把16个按键翻译成独立按键。

*  第二步: 再按独立按键的去抖动方式进行按键识别。

**/

void Key_Scan(void)

{

switch(ucKeyStep)

{

case 1: /*把16个按键的状态快速记录在uiKeyStatus变量的每一位中,相当于把矩阵键盘翻译成独立按键。*/

for(ucRowRecord = 1; ucRowRecord < 5; ucRowRecord ++)

{

if(ucRowRecord == 1) /*第一列输出低电平*/

{

Key5 = 0;

Key6 = 1;

Key7 = 1;

Key8 = 1;

/*如果是薄膜按键或者走线比较长的按键,此处应该加几个空延时,等待列输出信号稳定再判断输入的状态*/

if(Key1 == 0)

{

uiKeyStatus = uiKeyStatus & 0xfffe; /*S1*/

}

if(Key2 == 0)

{

uiKeyStatus = uiKeyStatus & 0xffef; /*S5*/

}

if(Key3 == 0)

{

uiKeyStatus = uiKeyStatus & 0xfeff; /*S9*/

}

if(Key4 == 0)

{

uiKeyStatus = uiKeyStatus & 0xefff; /*S13*/

}

}

else if(ucRowRecord == 2) /*第二列输出低电平*/

{

Key5 = 1;

Key6 = 0;

Key7 = 1;

Key8 = 1;

/*如果是薄膜按键或者走线比较长的按键,此处应该加几个空延时,等待列输出信号稳定再判断输入的状态*/

if(Key1 == 0)

{

uiKeyStatus = uiKeyStatus & 0xfffd; /*S2*/

}

if(Key2 == 0)

{

uiKeyStatus = uiKeyStatus & 0xffdf; /*S6*/

}

if(Key3 == 0)

{

uiKeyStatus = uiKeyStatus & 0xfdff; /*S10*/

}

if(Key4 == 0)

{

uiKeyStatus = uiKeyStatus & 0xdfff; /*S14*/

}

}

else if(ucRowRecord == 3) /*第三列输出低电平*/

{

Key5 = 1;

Key6 = 1;

Key7 = 0;

Key8 = 1;

/*如果是薄膜按键或者走线比较长的按键,此处应该加几个空延时,等待列输出信号稳定再判断输入的状态*/

if(Key1 == 0)

{

uiKeyStatus = uiKeyStatus & 0xfffb; /*S3*/

}

if(Key2 == 0)

{

uiKeyStatus = uiKeyStatus & 0xffbf; /*S7*/

}

if(Key3 == 0)

{

uiKeyStatus = uiKeyStatus & 0xfbff; /*S11*/

}

if(Key4 == 0)

{

uiKeyStatus = uiKeyStatus & 0xbfff; /*S15*/

}

}

else /*第四列输出低电平*/

{

Key5 = 1;

Key6 = 1;

Key7 = 1;

Key8 = 0;

/*如果是薄膜按键或者走线比较长的按键,此处应该加几个空延时,等待列输出信号稳定再判断输入的状态*/

if(Key1 == 0)

{

uiKeyStatus = uiKeyStatus & 0xfff7; /*S4*/

}

if(Key2 == 0)

{

uiKeyStatus = uiKeyStatus & 0xff7f; /*S8*/

}

if(Key3 == 0)

{

uiKeyStatus = uiKeyStatus & 0xf7ff; /*S12*/

}

if(Key4 == 0)

{

uiKeyStatus = uiKeyStatus & 0x7fff; /*S16*/

}

}

}

ucKeyStep = 2; /*切换到下一个运行步骤*/

break;

case 2: /*像独立按键一样进行去抖动和翻译。*/

if((uiKeyStatus & 0x0001) == 0x0001) /*说明1号键没有被按下来*/

{

uiKeyTimeCnt[0] = 0;

ucKeyLock[0] = 0;

}

else if(ucKeyLock[0] == 0)

{

uiKeyTimeCnt[0] ++;

if(uiKeyTimeCnt[0] > const_key_time)

{

uiKeyTimeCnt[0] = 0;

ucKeyLock[0] =1;

ucKeySec = 1;

}

}

if((uiKeyStatus & 0x0002) == 0x0002) /*说明2号键没有被按下来*/

{

uiKeyTimeCnt[1] = 0;

ucKeyLock[1] = 0;

}

else if(ucKeyLock[1] == 0)

{

uiKeyTimeCnt[1] ++;

if(uiKeyTimeCnt[1] > const_key_time)

{

uiKeyTimeCnt[1] = 0;

ucKeyLock[1] =1;

ucKeySec = 2;

}

}

if((uiKeyStatus & 0x0004) == 0x0004) /*说明3号键没有被按下来*/

{

uiKeyTimeCnt[2] = 0;

ucKeyLock[2] = 0;

}

else if(ucKeyLock[2] == 0)

{

uiKeyTimeCnt[2] ++;

if(uiKeyTimeCnt[2] > const_key_time)

{

uiKeyTimeCnt[2] = 0;

ucKeyLock[2] =1;

ucKeySec = 3;

}

}

if((uiKeyStatus & 0x0008) == 0x0008) /*说明4号键没有被按下来*/

{

uiKeyTimeCnt[3] = 0;

ucKeyLock[3] = 0;

}

else if(ucKeyLock[3] == 0)

{

uiKeyTimeCnt[3] ++;

if(uiKeyTimeCnt[3] > const_key_time)

{

uiKeyTimeCnt[3] = 0;

ucKeyLock[3] =1;

ucKeySec = 4;

}

}

if((uiKeyStatus & 0x0010) == 0x0010) /*说明5号键没有被按下来*/

{

uiKeyTimeCnt[4] = 0;

ucKeyLock[4] = 0;

}

else if(ucKeyLock[4] == 0)

{

uiKeyTimeCnt[4] ++;

if(uiKeyTimeCnt[4] > const_key_time)

{

uiKeyTimeCnt[4] = 0;

ucKeyLock[4] =1;

ucKeySec = 5;

}

}

if((uiKeyStatus & 0x0020) == 0x0020) /*说明6号键没有被按下来*/

{

uiKeyTimeCnt[5] = 0;

ucKeyLock[5] = 0;

}

else if(ucKeyLock[5] == 0)

{

uiKeyTimeCnt[5] ++;

if(uiKeyTimeCnt[5] > const_key_time)

{

uiKeyTimeCnt[5] = 0;

ucKeyLock[5] =1;

ucKeySec = 6;

}

}

if((uiKeyStatus & 0x0040) == 0x0040) /*说明7号键没有被按下来*/

{

uiKeyTimeCnt[6] = 0;

ucKeyLock[6] = 0;

}

else if(ucKeyLock[6] == 0)

{

uiKeyTimeCnt[6] ++;

if(uiKeyTimeCnt[6] > const_key_time)

{

uiKeyTimeCnt[6] = 0;

ucKeyLock[6] =1;

ucKeySec = 7;

}

}

if((uiKeyStatus & 0x0080) == 0x0080) /*说明8号键没有被按下来*/

{

uiKeyTimeCnt[7] = 0;

ucKeyLock[7] = 0;

}

else if(ucKeyLock[7] == 0)

{

uiKeyTimeCnt[7] ++;

if(uiKeyTimeCnt[7] > const_key_time)

{

uiKeyTimeCnt[7] = 0;

ucKeyLock[7] =1;

ucKeySec = 8;

}

}

if((uiKeyStatus & 0x0100) == 0x0100) /*说明9号键没有被按下来*/

{

uiKeyTimeCnt[8] = 0;

ucKeyLock[8] = 0;

}

else if(ucKeyLock[8] == 0)

{

uiKeyTimeCnt[8] ++;

if(uiKeyTimeCnt[8] > const_key_time)

{

uiKeyTimeCnt[8] = 0;

ucKeyLock[8] =1;

ucKeySec = 9;

}

}

if((uiKeyStatus & 0x0200) == 0x0100) /*说明10号键没有被按下来*/

{

uiKeyTimeCnt[9] = 0;

ucKeyLock[9] = 0;

}

else if(ucKeyLock[9] == 0)

{

uiKeyTimeCnt[9] ++;

if(uiKeyTimeCnt[9] > const_key_time)

{

uiKeyTimeCnt[9] = 0;

ucKeyLock[9] =1;

ucKeySec = 10;

}

}

if((uiKeyStatus & 0x0400) == 0x0400) /*说明11号键没有被按下来*/

{

uiKeyTimeCnt[10] = 0;

ucKeyLock[10] = 0;

}

else if(ucKeyLock[10] == 0)

{

uiKeyTimeCnt[10] ++;

if(uiKeyTimeCnt[10] > const_key_time)

{

uiKeyTimeCnt[10] = 0;

ucKeyLock[10] =1;

ucKeySec = 11;

}

}

if((uiKeyStatus & 0x0800) == 0x0800) /*说明12号键没有被按下来*/

{

uiKeyTimeCnt[11] = 0;

ucKeyLock[11] = 0;

}

else if(ucKeyLock[11] == 0)

{

uiKeyTimeCnt[11] ++;

if(uiKeyTimeCnt[11] > const_key_time)

{

uiKeyTimeCnt[11] = 0;

ucKeyLock[11] =1;

ucKeySec = 12;

}

}

if((uiKeyStatus & 0x1000) == 0x1000) /*说明13号键没有被按下来*/

{

uiKeyTimeCnt[12] = 0;

ucKeyLock[12] = 0;

}

else if(ucKeyLock[12] == 0)

{

uiKeyTimeCnt[12] ++;

if(uiKeyTimeCnt[12] > const_key_time)

{

uiKeyTimeCnt[12] = 0;

ucKeyLock[12] =1;

ucKeySec = 13;

}

}

if((uiKeyStatus & 0x2000) == 0x2000) /*说明14号键没有被按下来*/

{

uiKeyTimeCnt[13] = 0;

ucKeyLock[13] = 0;

}

else if(ucKeyLock[13] == 0)

{

uiKeyTimeCnt[13] ++;

if(uiKeyTimeCnt[13] > const_key_time)

{

uiKeyTimeCnt[13] = 0;

ucKeyLock[13] =1;

ucKeySec = 14;

}

}

if((uiKeyStatus & 0x4000) == 0x4000) /*说明15号键没有被按下来*/

{

uiKeyTimeCnt[14] = 0;

ucKeyLock[14] = 0;

}

else if(ucKeyLock[14] == 0)

{

uiKeyTimeCnt[14] ++;

if(uiKeyTimeCnt[14] > const_key_time)

{

uiKeyTimeCnt[14] = 0;

ucKeyLock[14] =1;

ucKeySec = 15;

}

}

if((uiKeyStatus & 0x8000) == 0x8000) /*说明16号键没有被按下来*/

{

uiKeyTimeCnt[15] = 0;

ucKeyLock[15] = 0;

}

else if(ucKeyLock[15] == 0)

{

uiKeyTimeCnt[15] ++;

if(uiKeyTimeCnt[15] > const_key_time)

{

uiKeyTimeCnt[15] = 0;

ucKeyLock[15] =1;

ucKeySec = 16;

}

}

if((uiKeyStatus & 0x8001) == 0x0000) /*S1和S16的组合键盘被按下。*/

{

if(ucKeyLock_01_16 == 0)

{

uiKeyTimeCnt_01_16 ++;

if(uiKeyTimeCnt_01_16 > const_key_time_comb)

{

uiKeyTimeCnt_01_16 = 0;

ucKeyLock_01_16 = 1;

ucKeySec = 17;

}

}

}

else

{

uiKeyTimeCnt_01_16 = 0; /*S1和S16组合按键去抖动延时计数器*/

[1] [2]
关键字:51单片机  矩阵键盘 引用地址:51单片机实现矩阵键盘的组合按键触发

上一篇:51单片机实现两片联级74HC595驱动16个LED灯
下一篇:51单片机实现矩阵键盘的单个触发

推荐阅读最新更新时间:2024-11-20 12:02

基于C语言51单片机电子密码锁的设计与仿真
  0、引言   电子密码锁是现代生活中常用的加密工具。它克服了机械式密码锁密码量少、安全性能差的缺点,尤其是的智能电子密码锁;不仅具有电子密码锁的功能”还可引人智能化管理功能,从而使密码锁具有更离的安全性和可靠性。   电子密码锁通常使用ARM和单片机控制,单片机相对ARM实现较为简单,功能较为完善,因此使用单片机控制较多。用单片机控制的窖码锁常使用汇编语言编写程序,显示器多数用。而本文所介绍的电子密犸锁使用移植性及可读性强的高级语言C语言编写,便于修改和增减功能蚤同时采用显示清楚数码管,功率消耗小而且寿命长的 液晶显示器,显示更加直观,使用更加方便。从经济实用的角度出发,采用STC89C52单片机设计出一种具有密码设置、报
[单片机]
基于C语言<font color='red'>51单片机</font>电子密码锁的设计与仿真
51单片机分时控制8路舵机程序
本程序中用到的头文件 12c5a.H下载: http://www.51hei.com/f/12c5a.rar //分时控制舵机,采用的单片机是STC12c5a 51增强型单片机,晶振11.0592MHZ #include 12c5a.H void delay(uint16 time); void Timer_init(); void Timer0(uint32 us); uint16 xdata pwm ={1500,1500,1500,1500,1500,1500,1500,1500}; sbit pwm1=P0^0; sbit pwm2=P0^1; sbit pwm3=P0^2; sbit pwm4=
[单片机]
51单片机对DS1302突发模式的读写
#include STC89C5xRC.H #include intrins.h #include DS1302.h //DS1302管脚 sbit SCLK = P3^6; //时钟 sbit CE = P3^5; //片选 sbit databus = P3^4; //双向IO //写模式寄存器 #define WRITE_CONTROL_SECONDS 0x80 //秒 //位7=1暂停 =0运行 #define WRITE_CONTROL_MINUTE 0x82 //分 #define WRITE_CONTROL_HOUR 0x84 //时 位7 1——12小时模式 0——2
[单片机]
51单片机简易波形发生器(正弦波 锯齿波 三角波)
下面是51单片机简易波形发生器源程序: #include AT89X52.h #include math.h #define ADDR1 0x2c //MAX5820LEUA sbit key_sin=P1^0; sbit key_tran=P1^2; sbit key_tooth=P1^4; sbit SCL = P2 ^ 0; sbit SDA = P2 ^ 1; unsigned char code sin = //正弦表 { 0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
[单片机]
<font color='red'>51单片机</font>简易波形发生器(正弦波 锯齿波 三角波)
51单片机的GPIO配置
导语 通过单片机控制外围器件(LED,蜂鸣器,数码管,按键),本质上是对于单片机IO口的操作,相对于STM32,51单片机IO口模式较少,但了解IO的内部对于学习了解51单片机也由很大的帮助。 GPIO GPIO(General Purpose Input Output),通用输入输出。既能当输入口使用,又能当输出口使用。端口,就是元器件上的一个引脚。可以通过软件去控制。 在大多数的时候,我们将IO口可以看为一个电子开关,通过向IO寄存器中写入相应的值,其输出的电平就随着寄存器的变化而变化,这是IO口的输出,在大多数的单片机中,需要去配置单片机的IO模式,是输入还是输出。 即需要预先初始化,配置GPIO的参数,再去使用
[单片机]
<font color='red'>51单片机</font>的GPIO配置
基于51单片机设计控制的荧光舞
0 引言 传统的路边装饰和节日彩灯等是利用电路的串并联来完成的,缺少更加生动的图形和效果。本设计是由单片机STC89C52控制,通过C语言编程完成动作编排和LED光带的显示,结合演员的舞蹈表演,在和谐或动感的音乐背景下展现跨越时空的神奇表演。 2 系统的总体设计 本次设计是由两种思维出发完成舞蹈与程序控制LED光带显示,一种是设定模式,一种是即兴模式。其中设定模式的程序编写是由整个舞蹈的编排和音乐的选取决定,本次设计编排有10个舞蹈程序供选取。本次设计主要即兴模式的选择完全有4×4按键完成。这样不仅有利于系统本身功能的扩展,而且方便使用在更多的载体上。系统设计框图如图1所示。 2 系统的主要硬件设计 2.1 数据处理
[单片机]
基于<font color='red'>51单片机</font>设计控制的荧光舞
51单片机2个外部中断的应用
;51单片机的P1口上接有8只LED。 ;在外部中断0输入引脚P3.2接有一只按钮开关K1。 ;在外部中断1输入引脚P3.3接有一只按钮开关K2。 ;要求K1和K2都未按下时,P1口的8只LED呈流水灯显示, ;仅K1(P3.2)按下时,左右4只LED交替闪烁。 ;仅按下K2(P3.3)时,P1口的8只LED全部闪亮。 ;两个外中断的优先级相同。 ;============================================= ;用 PROTSUE 仿真界面如下: ;下列程序,可以满足要求. ORG 0000H SJMP MAIN ORG 0003H SJMP X0_INT ORG 0
[单片机]
<font color='red'>51单片机</font>2个外部中断的应用
51单片机矩阵键盘PROTEUS仿真演示
程序如下: #include AT89x52.h #define uchar unsigned char; uchar key_val=0; //定义键值,初始默认为0 uchar code TAB ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e}; //0~F 共阳数码管显示段码 void Check_Key(void) { unsigned char row,col,tmp1,tmp2; tmp1 = 0x10; /
[单片机]

推荐帖子

新手求救~FPGA EP4CE6E22C8N + EPCS4S18 无法正常动作
新手的我,想请教各位大大一个问题:我用模拟板+动动板完成了一个电路后,就把电路洗了一块板子。板子回来了,可以烧录,但是FPGA根本没有动作,想请教各位大大可以朝哪几个方面去Debug呢?使用FPGA:EP4CE6E22C8N烧录ROM:EPCS4S18可以确认的是ROM里面的code是可以动作的,因为有一块市售的板子可以验证,但放在我新打的板子上,就不行了PS1.FPGA电路的部分如附件!PS2.我有发现CLK50MHz的波形在我的板子上很丑,会是这个原因吗?再麻烦
賴冠融 FPGA/CPLD
TI 中国大学计划20周年狂欢盛宴
活动详情TI中国大学计划20周年狂欢盛宴TI致力于帮助明日工程师完成创新理想。TI中国大学计划为老师和学生们提供了丰富的教学资源、实验室合作项目、科研合作项目以及电子设计竞赛平台让他们能在日常学习和研究中获得更多乐趣,在实践中掌握领先技术。TI中国大学计划已渗透至全国数百所高校致力于推动高校单片机(MCU)及嵌入式、模拟(Analog)以及数字信号处理(DSP)等领域的教学与实践。TI20周年大事记在此之际,我们将会有一系列的活动来庆祝TI中国大学计划2
EEWORLD社区 TI技术论坛
红鲱鱼:中国三大门户网站努力戒除无线瘾
 曾经令中国门户网站起死回生的无线业务似乎已经度过了它最繁荣的时期,不过幸运地是这几家网站都已经找到了其他出路。  国家广电总局在今年1月下发文件禁止广播电视等媒体机构发布带有封建迷信色彩的算命信息,而几大门户网站通过短信形式提供的星座信息也在此次查禁的范围内。  三年前,正是无线服务拯救了新浪、搜狐和网易,使得他们免于破产的厄运。不过当无线服务收入占到了三家网站总收入的一半时,分析家就已经提出警告称这种业务结构风险过大。  事实证明他们是对的,中国移动在去年采
yxh99 RF/无线
启动代码__program_start之前的这段代码
自己写了个小程序,仿真时将IAR里RUNTOmain点掉,将执行真实的执行过程,打开disassembly窗口就可看到程序将从启动代码__program_start处执行,因为0xfffe复位向量就是指向这个地址,但不是程序存储器ROM起始地址0X1100(我用的是F149,代码存储器起始地址为0x1100)在_program_start之前还有一点小的代码如下0011000001mova@PC,SP00110288DC8
xinbako 微控制器 MCU
请问谁有8*16点阵字母制作软件
我用它编一些字母代码,在网上没找到8*16的,都是16*16的汉字制作软件在这先谢谢了,请问谁有8*16点阵字母制作软件电子制作-->华岳电子上面哪个软件应该是可以的你试一下Re:请问谁有8*16点阵字母制作软件www.njhuayue.com我在这个网站上,没有找到8*16点阵字母制作软件,都是一些公司介绍\\产品分类........,没有软件下载请小51,能不能说的更具体一些,小弟谢谢了Re:请问谁有8*16点阵字母制作软件那个论坛里面有个软件你看看Re:
luchen7945137 单片机
馒头波电压驱动有刷电机实现恒速控制
最近在驱动一个直流有刷电机,不过我看样机电机的驱动电压是馒头波,如下图所示,蓝色的是电机两端电压,黄色的是单片机控速的PWM信号,紫色是速度光栅反馈信号,现在要实现PID恒速控制,有懂的朋友帮忙么?馒头波电压驱动有刷电机实现恒速控制不懂,看看
yaoquan5201314 电机驱动控制(Motor Control)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved