初学arduino求助-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: dongjy1993

[未解决] 初学arduino求助

[复制链接]
发表于 2018-10-15 08:41 | 显示全部楼层
dongjy1993 发表于 2018-10-12 20:27
对对对,大佬 我就是想实现这个列队循环使用引脚,但是arduino中列队是怎么编译的呢,他们有的说没有列队 ...

看你这个回复,不会又改变需求了吧  到底是一个输入点还是多个输入点?
还是那句话,坚持自己的需求不要改变,你之前的“简化”,或许是想让坛里的朋友帮你做个DEMO,然后你自己再改是不是,可你要知道,你的“简化”带来的可能是完全不同的编程思路,就是帮你写了代码,你也无从改起。
 楼主| 发表于 2018-10-15 09:53 | 显示全部楼层
上海老王 发表于 2018-10-15 08:41
看你这个回复,不会又改变需求了吧  到底是一个输入点还是多个输入点?
还是那句话,坚持自己的需求不 ...

大佬厉害!我这个确实是简化了,后期我还需要加一些其他东西,但对程序的更改很小(多了我也不会。。。),那个我输入输出点一直只有一个(我是要用红外线检测信号,控制电机工作,所以输入输出一直只有一个),但是要多次输入,前面我说的不明白带来了误解还请见谅。。前面那个我说的不对,我是看见他们给我的建议想着用循环数组这个知识点好像也能解决问题还能长点知识,但是我还是弄不出来。。。有个大佬帮我编好了程序我好多都还没看懂。。。学这个也不是那么简单的啊。。。
 楼主| 发表于 2018-10-15 10:03 | 显示全部楼层
shane 发表于 2018-10-14 15:32
看看这个借鉴一下:https://www.toutiao.com/i6542278429725688333/

嗯嗯,谢谢大佬,我看了这个,现在对队列有了比较清晰的认知,循环队列确实能很好地解决我这个问题,而且有位大佬@阿卜萝还帮我写了程序,很感谢他,他的程序也好像用了循环队列(我没看太懂还得好好查查资料),编程的道路很漫长啊。。。
发表于 2018-10-22 21:57 | 显示全部楼层
dongjy1993 发表于 2018-10-15 10:03
嗯嗯,谢谢大佬,我看了这个,现在对队列有了比较清晰的认知,循环队列确实能很好地解决我这个问题,而且 ...

程序能否分享一下,对于我自己也很有帮助
发表于 2018-10-23 13:13 | 显示全部楼层
dongjy1993 发表于 2018-10-15 09:53
大佬厉害!我这个确实是简化了,后期我还需要加一些其他东西,但对程序的更改很小(多了我也不会。。。) ...


好几天没来看了,你开贴也有一月有余,之所以说你这个需求很有意思,因为对时效性很高,而且又要做成类似多任务的形式,这两天我纯当练手,给你做了个简单粗暴型的便于阅读(之前的兄弟做的太过高大上,好难看懂 ),这个程序包含了你之前提出的脉冲宽度抓取及倍率的需求,程序不长,希望你喜欢 。下面是程序:

/*
  本程序在 Arduino UNO R3 上调试通过,并用逻辑分析仪确认输出正常。
  loop循环工作频率受队列长度影响,
  实测队列长度为20时是17.24KHz左右,所以采样精度在0.058ms左右
  实测队列长度为200时是2.85KHz左右,所以采样精度在0.351ms左右
  考虑内存稳定性及抓取可靠性,建议队列长度可用100,此时的loop频率大于3.06KHz,采样周期小于在0.327ms
*/
int pulsein = 5;  //输入端口,可变更
int pulseout = 10;  //输出端口,可变更,尽量不用13口,因系统启动时13口会有复位动作
int const mylimit = 100;  //定义最大队列长度
unsigned long pulseinon[mylimit];  //数组,记录输入脉冲上升沿时间
unsigned long pulseinoff[mylimit];  //数组,记录输入脉冲宽度(毫秒数)
unsigned long tempmillis = 0;  //记录实时millis数
int pulseguide = 0;  //输入脉冲队列指针
bool inflag = false;  //输入状态记录
float pulsedelay1 = 7.77;  //倍率,可调
float pulsedelay2 = 250.0;  //输出毫秒数,可调
int pulseoutflag = 0; //状态标志,用于控制最终输出

void setup() {
  pinMode(13, OUTPUT);  //防止板载LED误动作
  pinMode(pulsein, INPUT);
  pinMode(pulseout, OUTPUT);
  for (int j = 0; j < mylimit; j++) {  //缓冲区清零(不知有无必要,反正放着没坏处)
    pulseinon[mylimit] = 0ul;
    pulseinoff[mylimit] = 0ul;
  }
}

void loop() {
  tempmillis = millis();  //loop循环周期小于1ms,所以loop内只采集一次millis
  if (digitalRead(pulsein) == HIGH && inflag == false) {  //抓取输入脉冲上升沿
    pulseinon[pulseguide] = tempmillis;
    inflag = true;
  }
  if (digitalRead(pulsein) == LOW && inflag == true) {  //抓取输入脉冲下降沿
    pulseinoff[pulseguide] = tempmillis - pulseinon[pulseguide];
    inflag = false;
    pulseguide++;
    if (pulseguide >= mylimit) pulseguide = 0;  //队列回滚
  }

  pulseoutflag = 0; //队列扫描前标志置零
  for (int i = 0; i < mylimit; i++) {  //扫描队列,以全“或”状态输出“标志”
    if (pulseinoff > 0) { //避开脉冲宽度为0的队列记录以防误动作
      if (tempmillis - pulseinon >= pulseinoff * (1 + pulsedelay1)
          && tempmillis - pulseinon <= pulseinoff * (1 + pulsedelay1) + 250) {
        pulseoutflag = 1;
      }
    }
  }
  digitalWrite(pulseout, pulseoutflag);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:32 , Processed in 0.101683 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表