weixin_46437325 2024-03-29 09:09 采纳率: 100%
浏览 21
已结题

Arduino定时器为什么和串口通讯冲突?怎么解决呢?

电脑用的是很老的笔记本,操作系统是ubuntu22,编程环境是Arduino IDE2.2.1。
写的代码中有两部本内容互相冲突。代码如下:
设置time0

unsigned long count=0;
int angle=0;
char val = '\0';

  void setup(){
    Serial.begin(9600);
    pinMode(7,OUTPUT);
    noInterrupts();
      TCCR0A = 0;// set entire TCCR1A register to 0
      TCCR0B = 0;// same for TCCR1B
      TCNT0  = 0;//initialize counter value to 0
      // set compare match register for 100Mhz increments
      OCR0A = 15;// = (16*10^6) / (100000*8) - 1 (must be <65536)
      // turn on CTC mode
      TCCR0A |= (1 << WGM01);
      // Set CS10 and CS12 bits for 8 prescaler
      TCCR0B |= (1 << CS00);  
      // enable timer compare interrupt
      TIMSK0 |= (1 << OCIE0A);
    interrupts();
    }

100MHz中断一次,控制引脚电压

ISR (TIMER0_COMPA_vect){// timer0中断100MHz方波控制电机
if(count>=0 && count<=map(angle,0,180,50,250)){
      digitalWrite(7, HIGH);
}else if (count>map(angle,0,180,50,250) && count<2000) {
      digitalWrite(7, LOW);
}else {
      count=0;
}
++count;

接受串口命令

void loop(){
());
  if(Serial.available()){
    val=Serial.read();
    switch (val) {
    case 'b':
        angle = Serial.parseInt();
        Serial.println(angle);
        break;
    }
  }
}

问题一、开启Time0中断后无法接受串口命令。关闭中断后正常可以接受串口命令。
问题二、全部代码上传Arduino uno3后,电机直接转到180度。
问题三、以上代码无论使用Timer0,1,2。影响一样。串口通讯和定时器之间是有什么影响么?使用Servo库函数就没有影响。实在是搞不懂。

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-03-30 02:51
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    在Arduino中,定时器的使用会影响串口通讯的正常进行,因为定时器会占用一些资源并可能引起中断,从而影响串口通讯的稳定性。根据你的描述,遇到了几个问题:

    1. 开启定时器中断后无法接受串口命令。
    2. 上传完整代码后,电机直接转到180度。
    3. 使用Timer0、Timer1、Timer2都会出现相同的问题。
      解决这些问题的思路如下:
    4. 中断优先级问题 :可能是中断优先级设置不当导致串口通讯无法正常工作。建议在设置定时器中断时,确保串口通讯的中断优先级较高,可以通过设置 TCCR0B 寄存器的相应位来调整中断优先级。具体可以参考 AVR Libc Reference Manual 中的相关文档。
    5. 电机转动问题 :可能是定时器中断导致电机控制代码执行异常。可以尝试在定时器中断中添加一些延时或者调整电机控制的逻辑,确保电机能够按照预期进行控制。
    6. 定时器选择 :考虑到使用不同的定时器都会出现相同的问题,可能是定时器配置不当导致。建议详细查阅 Arduino 官方文档或者相关资料,确保对定时器的配置和使用理解正确。
      最后,强烈建议在编写代码时,尽量避免直接操作底层寄存器,可以使用 Arduino 提供的库函数来简化开发,这样可以减少因为底层操作不当导致的问题。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月29日

悬赏问题

  • ¥15 (标签-考研|关键词-set)
  • ¥15 求修改代码,图书管理系统
  • ¥15 请问有没求偏多标签数据集yeast,reference,recreation,scene,health数据集。
  • ¥15 传感网应用开发单片机实训
  • ¥15 Delphi 关于sAlphaImageList使用问题
  • ¥15 寻找将CAJ格式文档转txt文本的方案
  • ¥20 数电设计提问求帮助,出租车计费器
  • ¥15 shein测试开发会问些啥我是写java的
  • ¥15 关于#单片机#的问题:我有个课程项目设计,我想在STM32F103veTX单片机,M3主控模块上设计一个程序,在Keil uVision5(C语言)上代码该怎么编译?(嫌钱少我可以加钱,急急急)
  • ¥15 opnet仿真网络协议遇到问题