arduino编码器计数_关于电机中断计数问题 - Arduino - 极客工坊 - Powered by Discuz!...
如果您不介意的话,可以看下我个程序,delay只用在EEPROM读写这里
#include
#include
union data //EEPROM 数据类型 字节拆分 转换
{
long a;
byte b[4];
};
data col;
int addr = 0;
int addr1 = 9;
int RECV_PIN = 12; //红外脚
int Frelay=11; // 继电器控制电机 启/停
int Drelay=10; // 继电器控制电机 正/反转 通过H桥改变电源正/反
unsigned long time1 = 0, time2 = 0 ,time3 = 0 ,time4 = 0 ,old_time4 = 0; // 时间标记
unsigned long S=2; //空隙距离
long F1; //行程计数
long F3; //行程计数
long num;
long num1; //每100ms 计数
long num2; //每200ms 计数
int count=0; //计数
int Start=0; //开启计数变量
int Pause=0; //暂停按键变量
int Change=0; //100ms 200ms交换变量
int d=0; //F1存入EEPROM变量
int e=0; //开启行程比较变量
int f=0; //行程设置自动返回变量
int g=0; //行程比较变量
int Direction=0; //方向变量
int Function=0;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
pinMode(Frelay,OUTPUT);
pinMode(Drelay,OUTPUT);
pinMode(2,INPUT_PULLUP);
attachInterrupt(0,Count,CHANGE);
irrecv.enableIRIn();
}
void loop()
{
Infrared(); //红外遥控
SpeedCompare(); //速度比较
}
void Infrared()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX);
if(Direction==0)
{
if(results.value==0xFFA25D) //正转按钮
{
for(addr ; addr < 4 ; addr++) //从EEPROM中读出数值 并赋值与F3
{
col.b[addr]=EEPROM.read(addr);
delay(3);
}
F3=col.a;
digitalWrite(Frelay,1);
Start=1;
e=1;
Serial.print("F3=");
Serial.println(F3);
}
if(g==1) //中途返回按键
{
if(results.value==0xFF629D)
{
count=0;
num=0;
num1=0;
num2=0;
digitalWrite(Frelay,1);
digitalWrite(Drelay,1);
Start=1;
e=1;
}
}
}
if(Direction==1)
{
if(results.value==0xFF629D) //反转按钮
{
for(addr ; addr < 4 ; addr++) //从EEPROM中读出数值 并赋值与F3
{
col.b[addr]=EEPROM.read(addr);
delay(3);
}
F3=col.a;
digitalWrite(Frelay,1);
digitalWrite(Drelay,1);
Start=1;
e=1;
Serial.print("F3=");
Serial.println(F3);
}
if(g==1) //中途返回
{
if(results.value==0xFFA25D)
{
count=0;
num=0;
num1=0;
num2=0;
digitalWrite(Frelay,1);
Start=1;
e=1;
}
}
}
if(results.value==0xFFC23D) //暂停键
{
if(Pause==0)
{
g=1;
digitalWrite(Frelay,0);
Start=0;
F1=count;
Pause=1;
Serial.print("F1=");
Serial.println(F1);
}else{
digitalWrite(Frelay,1);
Start=1;
Pause=0;
g=0;
}
}
if(results.value==0xFF906F) //行程设置键
{
Function = EEPROM.read(addr1);
delay(3);
if(Function==0)
{
Function=1;
EEPROM.write(addr1, Function);
delay(3);
digitalWrite(Frelay,1);
Start=1;
f=1;
Serial.print("Function=");
Serial.println(Function);
}else{
for(int i=0; i<512 ; i++) //清除EEPROM内容
{
EEPROM.write(i, 0);
delay(3);
}
for(addr1; addr1<10 ; addr1++) //清除EEPROM内容
{
EEPROM.write(addr1, 0);
delay(3);
}
Serial.print("col.a=");
Serial.println(col.a);
Serial.print("Function=");
Serial.println(Function);
F3=0;
}
}
irrecv.resume();
}
}
void Count()
{
if(Start==1)
{
if((millis()-time3)>5) //为了不计入噪音干扰脉冲,
{ //当2次中断之间的时间大于5ms时,计一次有效计数
count += 1; //当编码器码盘的OUTA脉冲信号下跳沿每中断一次,编码器码盘计数加一
Serial.print("count=");
Serial.println(count);
DirectionCompare(); //行程比较控制停止
}
time3=millis();
}
}
void SpeedCompare()
{
if(Start==1)
{
if ((millis()-time1>=100) && Change==0)
{
time1=millis();
num1=count;
Change=1;
}
if ((millis()-time2>=200) && Change==1)
{
time2=millis();
num2=count;
num=num2-num1;
Serial.print("num=");
Serial.println(num);
Change=0;
}
if(num==0 && count>10)
{
digitalWrite(Frelay,0);
Start=0;
if(d==1)
{
col.a=count;
for(addr ; addr < 4 ; addr++) //将count写入EEPROM
{
EEPROM.write(addr, col.b[addr]);
delay(3);
}
Serial.println("1111111111");
}
d=0;
count=0;
if(f==1)
{ //行程设置 闭合后 自动返回
//delay(2000);
digitalWrite(Drelay,1);
digitalWrite(Frelay,1);
Start=1;
d=1;
f=0;
Serial.println("222222222");
}
}
}
}
void DirectionCompare()
{
if(F3-S
{
digitalWrite(Frelay,0);
digitalWrite(Drelay,0);
Start=0;
count=0;
e=0;
if(Direction==0)
{
Direction=1;
}else{
Direction=0;
}
}
if(F1-1
{
digitalWrite(Frelay,0);
digitalWrite(Drelay,0);
Start=0;
count=0;
e=0;
g=0;
}
}
arduino编码器计数_关于电机中断计数问题 - Arduino - 极客工坊 - Powered by Discuz!...相关推荐
- arduino编码器计数_基于Arduino开发环境的光电编码器检测仪设计方案 - 全文
0 引言 Arduino是一款基于单片机系统的电子产品开发平台,它的软硬件系统都具有高度的模块化,而且软件系统是完全开源的.其硬件系统也是高度模块化的,在核心控制板的外围有开关量输入/输出模块.各种模 ...
- arduino编码器计数_旋转编码器的工作原理以及如何在Arduino中使用
在本篇文章中,我们将学习旋转编码器的工作原理以及如何将其与Arduino开发板一起使用.旋转编码器是一种位置传感器,用于确定旋转轴的角度位置.它根据旋转运动产生模拟或数字电信号. Rotary-Enc ...
- arduino编码器计数_几根线做的Arduino液晶屏旋转编码器带你进入数字化编程之旅...
#define ENCODER_A_PIN 2 #define ENCODER_B_PIN 3 #define SWITCH_PIN 4 long position;// int latchPi ...
- arduino 休眠 节能_魔法书3:让 Arduino 慢下来 20倍省电
我是潘,曾经是个工程师.这是 "Arduino 魔法书" 系列的专栏.上节课介绍了怎么让Arduino 全速运行,但大部分时候我们更希望 Arduino 能慢下来,节省更多的电能, ...
- arduino编码器计数_ARDUINO旋转编码器
旋转编码器 旋转编码器可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种 转动计数是没有限制的.配合旋转编码器上的按键,可以复位到初始状态,即从 0 开始计数. 工作原 ...
- arduino 呼吸灯_如何改善您的Arduino呼吸机:用于临时COVID-19呼吸机设计的RTS和SCS简介...
arduino 呼吸灯 The world as we know it was recently taken by storm. That storm was the outbreak of the ...
- arduino 有源 蜂鸣器_穷创客教育之Arduino编程第十课:蜂鸣器电子琴
欢迎注册,加入沙洋社区-我们的网上家园! 您需要 登录 才可以下载或查看,没有帐号?注册 x 穷创客教育之Arduino编程第十课:蜂鸣器电子琴 蜂鸣器又分为有源蜂鸣器和无源蜂鸣器两种,无源蜂鸣器的电 ...
- 极客时间和极客学院_极客奔跑
极客时间和极客学院 I'm not a natural runner. I'm reasonably fit given that I spend most of the day sat in my ...
- STM32入门笔记03_EXTI外部中断详解+案例:红外对射计数、旋转编码器计数
EXTI外部中断 中断的相关概念 中断源: 可以引起中断的事件称为中断源 中断: 在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成 ...
最新文章
- swoole 内存Memory
- 用c++来开发php的底层模块|用c++来开发apache模块,Apache模块开发实例(2)
- 每日一句(2014-9-22)
- 利用matlab小波GUI工具箱对空挡噪声进行滤波
- 中移4G模块-ML302-OpenCpu开发-(固件编译和烧录)
- iOS开发,轻松获取根控制器当前控制器的正确方式
- 9.9递归和动态规划(十二)——小鸡吃米
- matlab imf1,NGPM_v1.4y GA多目标优化的程序 带约束 里面有教程 matlab 272万源代码下载- www.pudn.com...
- 首届电子商务AI算法大赛 Organized by automlai
- CAD直线和平面投影
- 《彩虹屁》快夸夸我!彩虹屁生成器
- JS 【详解】作用域
- 计算机怎么显示各磁盘容量,win7系统打开计算机不显示磁盘容量的解决方法
- 【时间之外】做产品必须知道的SKU是什么?
- 量子计算磁共振原型机被激光脉冲原型机淘汰
- Auto Layout和UILabel
- 可行方向法的matlab代码,基于MATLAB的可行方向法求极值问题参考.doc
- cJSON笔记——三种结构的cJSON数组
- MT6169 RF System Datasheet资料介绍
- 腾讯云星星海SA2云服务器优惠购买指南
热门文章
- 毕设-基于STM32刷卡、指纹的门禁系统的设计与实现(进阶版)
- 51xunji双PWM 002 蓝牙 L9110电机驱动
- 【稳定性day10】美团MySQL的高可用架构 - 对标业内的一些解决方案
- Bartender 4怎么用?Bartender 4 mac使用教程
- layui富文本编辑器layedit增加上传视频与音频功能
- 如何让文本超出 部分/文本框 显示省略号
- 漫谈CRM体系化建设5:CRM体系化解决方案
- 系统自带测试软件,用Windows自带工具给电脑检测的方法
- 计算机画大熊猫教案,幼儿园大班教案:水墨画《大熊猫》
- IDEA快捷键之“跳入接口实现类”