佛山新網(wǎng)站制作平臺鄭州seo優(yōu)化公司
使用定時器進行精確延時,串口接收數(shù)據(jù)進行
50? ? ? ? ?0度? ? ? ? ? ?--十六進制32
250??????180度????????--十六進制FA
串口接收到AA 32兩個字節(jié),舵機轉(zhuǎn)到0度;接收到AA FA,轉(zhuǎn)到180度。請驗證代碼:
const unsigned long TIMER_PRESCALER = 72; ?// 定時器預分頻因子
const unsigned long MICROSECONDS_PER_SECOND = 1000000; ?// 每秒微秒數(shù)
void setup() {
? Timer4.setPrescaleFactor(TIMER_PRESCALER); ?// 設(shè)置定時器預分頻因子
? Timer4.pause(); ?// 關(guān)閉定時器
? Serial.begin(9600); ?// 初始化串口通信
? pinMode(PB9,OUTPUT);
}
char incomedate[2];
void loop() {
if (Serial.available() > 0)//串口接收到數(shù)據(jù)
? {
? ? 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); ?// 創(chuàng)建定時器對象
? unsigned long start = micros(); ?// 獲取當前時間
? while (micros() - start < us) { ?// 計算已經(jīng)延時的微秒數(shù)
? ? timer.setCount(0); ?// 將計數(shù)器歸零
? ? timer.setOverflow((TIMER_PRESCALER * us) / MICROSECONDS_PER_SECOND); ?// 設(shè)置溢出值,單位為計數(shù)周期
? ? timer.resume(); ?// 啟動定時器,開始延時
? ? while (timer.getCount() > 0) {} ?// 等待延時完成
? ? timer.pause(); ?// 暫停定時器
? }
}
?