![]() |
發布時間: 2021-5-11 17:01
正文摘要:重載TM2的高位初始值 這條指令走了600多個機器周期 重載低位初始值也是 這合理嗎(First和FRE是全局變量,First是設定不變的初試值,FRE是計算好的儲存值) |
旅途1 發表于 2021-5-12 16:59 你在做PWM調節嗎? 1 確定鍵全局變量換成普通數字是否會恢復正常 2 中斷是否會嵌套 例如TIM1中斷里面觸發TIM2中斷 3 你的全局變量是否在主函數頻繁出現 例如if(First > 0){delay_ms(10);這里是中斷{First = 0;}First = First - 100;} |
不合理,進debug看匯編代碼大概查一下。 |
黃youhui 發表于 2021-5-12 10:11 uint curvalue; uint error; uint enlarge; uint FRE=0; uint First=500; uint setvalue=20; //數據類型 uint為"unsigned int" void time1() { TMOD |=0X01; TH0=(65536-2000)/256; TL0=(65536-2000)%256; EA=1; ET0=1; TR0=1; } void TIM2Inital() { T2MOD=0; TH2=(65536-(First+FRE))/256; //設置定時初值 TL2=(65536-(First+FRE))%256; //設置定時初值 RCAP2H = (65536-(First+FRE))/256; //設置定時重載值 RCAP2L = (65536-(First+FRE))%256; //設置定時重載值 EA=1; //打開總中斷 ET2=1; //打開定時器中斷 TR2=1; //打開定時器開關 } void timer1(void)interrupt 1 { TH0=(65536-2000)/256; TL0=(65536-2000)%256; RCAP2H = (65536-(First+FRE))/256; //設置定時重載值 RCAP2L = (65536-(First+FRE))%256; //設置定時重載值 } void TM2(void) interrupt 5 using 1 { TF2=0; //自動清零 if(curvalue<=20) { error=setvalue-curvalue; //偏差,靠近設定值時遞減 enlarge=50*error; //放大 FRE=1000-enlarge; //靠近設定值時FRE遞增,脈沖頻率變大,速度變慢 DIR=1; if(error<3) { ET2=0; } } else { DIR=0; error=curvalue-setvalue; //同上 enlarge=5*error; FRE=1000-enlarge; } shudu2=~shudu2; } |
黃youhui 發表于 2021-5-12 10:11 謝謝您的回答 這個 我試了下 定時器0 寫(65536-1000)/256和直接寫“256”這樣都是兩個機器周期 TM2定時器直接寫“256”這樣的也是兩個機器周期 而(65536-(First+FRE))/256這樣寫就600多個機器周期 ![]() 下面附上部分程序 |
旅途1 發表于 2021-5-12 10:00 這樣試試看,你初始化時不要計算(65536-1000)/256這些,你就直接TH0 = 252;TH1 = 24;.可能是你的單片機不具備多位數的算法(浮點算法) |
黃youhui 發表于 2021-5-12 08:24 不是 就這一個 所以很納悶 |
名字不是重點 發表于 2021-5-11 23:21 用keil5仿真 可以看匯編語言嗎 |
TTQ001 發表于 2021-5-12 07:45 是每個指令都600機器周期嗎?如果是的話就是單片機問題。 |
600個機器指令周期似乎是不可能的。 |
寫的timer1實際上是定時器0。。。。一個加法減法除法應該用不了那么多,仔細檢查一下 |
這個要看C代碼展開后的匯編代碼是什么。。 一行C可能會編譯成N條匯編指令。。 |
確認First和FRE是否為浮點數據類型 |
花心的劉備 發表于 2021-5-11 21:33 不是 為unsigned int類型 |
npn 發表于 2021-5-11 17:55 不是 無符號整數型 |
First和fre是什么類型的?是不是float類型的? |
請確認First和FRE是否為浮點數據類型。 |