STM32duino舵机控制-2

使用定时器进行精确延时,串口接收数据进行

50         0度           --十六进制32

250      180度        --十六进制FA

串口接收到AA 32两个字节,舵机转到0度;接收到AA FA,转到180度。请验证代码:

const unsigned long TIMER_PRESCALER = 72;  // 定时器预分频因子
const unsigned long MICROSECONDS_PER_SECOND = 1000000;  // 每秒微秒数

void setup() {
  Timer4.setPrescaleFactor(TIMER_PRESCALER);  // 设置定时器预分频因子
  Timer4.pause();  // 关闭定时器
  Serial.begin(9600);  // 初始化串口通信
  pinMode(PB9,OUTPUT);
}

char incomedate[2];

void loop() {
if (Serial.available() > 0)//串口接收到数据
  {

    Serial.readBytes(incomedate,2);
    if(incomedate[0]==0xAA)
    {
      //digitalWrite(LED_BUILTIN,LOW);// LED 亮起

      if(incomedate[1]>=50 && incomedate[1]<=250)
        for(int i=0;i<50;i++)
        {
        digitalWrite(PB9,1);
        delayMicrosecondsWithTimer4(incomedate[1]*10);
        digitalWrite(PB9,0);
        delayMicrosecondsWithTimer4(19500);
        }

    }
    if(incomedate[0]=='s')
      Serial.println("test!");
  }

    delay(5);


  
}

void delayMicrosecondsWithTimer4(unsigned long us) {
  HardwareTimer timer(4);  // 创建定时器对象
  unsigned long start = micros();  // 获取当前时间
  while (micros() - start < us) {  // 计算已经延时的微秒数
    timer.setCount(0);  // 将计数器归零
    timer.setOverflow((TIMER_PRESCALER * us) / MICROSECONDS_PER_SECOND);  // 设置溢出值,单位为计数周期
    timer.resume();  // 启动定时器,开始延时
    while (timer.getCount() > 0) {}  // 等待延时完成
    timer.pause();  // 暂停定时器
  }
}
 

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值