作者mick99988 (高雄人)
看板ASM
標題Re: [問題] 想問關於89S52去控制伺服馬達相關問題
時間Mon Oct 26 23:05:30 2015
※ 引述《WolfLord (呆呆小狼)》之銘言:
: ※ 引述《mick99988 (高雄人)》之銘言:
: : 不過89S52只有3組Timer夠給4個PWM給4個Servo馬達嗎?
: 你會寫,一個T1或T0就夠你輸出8~16的PWM了,而且還很精準(之前在板上有寫
: 過範例,但是好像不見了)
: 其實,一個8051就能做很多事了,操控個四軸機械手臂其實還很閒。
: 事實是你的創造力有多大MCU就有多強大,而不是MCU有些什麼你才能
: 做些什麼。
: 機械的動作都是以mS為單位的,一個24Mhz的8052指令是用500nS的速
: 度在跑。除非你的程式寫得跟破抹布一樣,不然為什麼會需要用到16
: 或32Bit的MCU才夠快??
今天在網路上找用中斷產生PWM的寫法,發現很多文章都套用這個
unsigned int dutytime=20000; //65536-45536就是責任週期
unsigned int ton=1280; //高電位比例=50% <----這邊的高低電位為什麼要這樣設?
unsigned int toff=20000-1280; //低電位比例=50% 不會很多此一舉嗎
unsigned int temp; //給計時器工作用
void Timer0_init(void) //初始化計時器0
{
EA=0; //關閉中斷功能(所有中斷副程式失效)
IE|=0x02; //開啟計時器中斷功能
TMOD|=0x01; //設定計時器模式
temp=65536-dutytime; //設定中斷一次的時間(預設是dutytime)
TH0=temp/256; //填入高八位
TL0=temp%256; //填入低八位
TR0=1; //啟動計時器
EA=1; //開啟中斷功能(中斷副程式可以執行)
}
void main(void) //主程式開始
{
Timer0_init();
P3=0xff;
while(1)
{
if(P3_0==0){
ton=420;
toff=20000-ton;
}
if(P3_1==0){
ton=671;
toff=20000-ton;
}
if(P3_2==0){
ton=923;
toff=20000-ton;
}
if(P3_3==0){
ton=1174;
toff=20000-ton;
}
跟我在課本上範例解取部分
main()
{
TMOD=0x01;
TH0=(65536-92)/256; 產生每100us中斷一次
TL0=(65536-92)%256;
IE=0x82;
TR0=1;
while(1)
{
s1=15;
delay_ms(1000);
}
}
想問的是都直接把設定寫在這裡跟另外用一個副程式去初始化有何不同?
然後是不懂他們所說的Dutytime是做什麼的?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.175.110.116
※ 文章網址: https://webptt.com/m.aspx?n=bbs/ASM/M.1445871933.A.509.html
※ 編輯: mick99988 (1.175.110.116), 10/26/2015 23:26:34
1F:推 chuegou: 會這樣寫主要是為了看懂.修改時不易改錯 10/27 01:28
2F:→ chuegou: 副程式再次呼叫比較方便 10/27 01:30
3F:→ chuegou: duty你就想像成水龍頭,開越大水越多 10/27 01:31
4F:→ chuegou: 通常目標是馬達轉越快,當然也可以拿去加熱器或power用 10/27 01:33