使用定时器进行精确延时,串口接收数据进行
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(); // 暂停定时器
}
}