求助,怎样让ad采样不会影响程序的继续执行,即可以多线程-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1527|回复: 28

[未解决] 求助,怎样让ad采样不会影响程序的继续执行,即可以多线程

[复制链接]
发表于 2022-4-12 01:09 | 显示全部楼层 |阅读模式
本帖最后由 peter1999516 于 2022-4-12 01:13 编辑

尝试过用millis函数了,不行
如下是我的中断子程序,大意就是每次执行if判定前进行ad采样,让后决定那几个数字口发出占空比100的伪pwm波(周期70us),但是ad采样还是会占用时间,使得输出波形看起来不是100,如何才能使得ad采样的执行在pwm波形发出的同时,最好是pwm周期的前1/5,小白求大佬指点。
void pwm() //中断子程序 pwm方波输出
{

  do
{
   int sensorvalue=analogRead(A0)/50;//ad程序,总是在判定哪个角发出对应方波前进行采样
    if(sensorvalue>15)
  {

  digitalWrite(13, HIGH);
  digitalWrite(12, HIGH);
  delayMicroseconds(70);
  digitalWrite(13, LOW);
  digitalWrite(12, LOW);
   pwm_xunhuancishu=pwm_xunhuancishu+1;//用来退出中断用
   // Approximately 10% duty cycle @ 1KHz


       //标志位加1,每5个循环一个采集
       }
else if(sensorvalue<10) //后期加入与或运算,满足合闸或者分闸需求。先与后或
{

  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  delayMicroseconds(70);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
pwm_xunhuancishu=pwm_xunhuancishu+1;
   // Approximately 10% duty cycle @ 1KHz
    }

}
while(pwm_xunhuancishu<10000);//这块为了方便观察室大概1s结束中断,后面会改成100ms
   }

mmexport1649696514943.jpg
IMG_20220412_011302.jpg
发表于 2022-4-12 10:03 | 显示全部楼层
上 ESP32 试试?
 楼主| 发表于 2022-4-12 11:47 来自手机 | 显示全部楼层
求大佬解答
 楼主| 发表于 2022-4-12 18:34 | 显示全部楼层
顶一下,求解答
发表于 2022-4-12 19:38 | 显示全部楼层
换STM32 DMA读取
发表于 2022-4-12 22:09 | 显示全部楼层
在arduino上运行FreeRTOS。
 楼主| 发表于 2022-4-13 15:43 | 显示全部楼层
topdog 发表于 2022-4-12 22:09
在arduino上运行FreeRTOS。

所以uno就没办法做到同时ad同时发出方波了吗?我看有教学用millis函数的,说是可以避免delay延迟,但是貌似都是ms级的定时
 楼主| 发表于 2022-4-13 16:46 | 显示全部楼层
刚才尝试把方波程序改成了miromills延时,但是并不能解决ad占用理论占空比的情况,应为ad总是在pwm输出后才进行。  do
{
   int sensorvalue=ADC_8bit(0)/12;//ad程序,总是在判定哪个角发出对应方波前进行采样
    if(sensorvalue>15) //3.7v
  {
//-1态
delayMicroseconds(100);
   pwm_xunhuancishu=pwm_xunhuancishu+1;//用来退出中断用
   // Approximately 10% duty cycle @ 1KHz
   
   
       //标志位加1,每5个循环一个采集
       }
else  if(sensorvalue<5) //后期加入与或运算,满足合闸或者分闸需求。先与后或 1.3v
{
  digitalWrite(13, HIGH);// 1态
  digitalWrite(12, HIGH);
  unsigned long currentMillis = micros();
if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
  digitalWrite(13, LOW);
  digitalWrite(12, LOW);
pwm_xunhuancishu=pwm_xunhuancishu+1;
   // Approximately 10% duty cycle @ 1KHz
    }


pwm_xunhuancishu=pwm_xunhuancishu+1;
   // Approximately 10% duty cycle @ 1KHz
    }
    else if((sensorvalue>5)&&(sensorvalue<15))//后期加入与或运算,满足合闸或者分闸需求。先与后或 1.5v-3.5v
{
  
  digitalWrite(13, HIGH); // 0态
unsigned long currentMillis = micros();
if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
  digitalWrite(13, LOW);// 78角管分闸
  
pwm_xunhuancishu=pwm_xunhuancishu+1;
}
      
}
}
while(pwm_xunhuancishu<50000);
 楼主| 发表于 2022-4-13 16:47 | 显示全部楼层
目前问题的关键就是怎么让ad采样发生在发出的方波区间内了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 09:34 , Processed in 0.077760 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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