Re: [問題] C++求救!不知道問題在哪裡!!
本來有點懶得用回文的
不過有幾點你要先想清楚
從ASM來看
1.馬達的動作是靠延遲來決定的。
2.馬達驅動後需要有HOLD TIME
3.動作需要交叉驅動
但是你的C卻是
1.持續一次給了一個馬達的動作量,然後才驅動第二個。
2.完成後沒有HOLD TIME
結果可能第一個被呼叫的因為改叫第二個的時間而動作
而第二個馬達卻沒有足夠的時間ACTIVE
您就仔細想想差異在哪吧?
你一直說電路都一樣,但是事實上就是改變了。但是改變之後是不是
符合馬達特性?你是否有確認?
另外,你的描述很差勁,馬達到底是STEP還是SERVO?
SETP除非有其他COUNT電路,不然不會只給脈衝就好。但是給脈衝的話
控制角度的原理也不是這樣。至於SERVO則是需要搭配回授脈衝與計時
微分。你的程式看不出來你如何處理回受脈衝。
一模一樣的程式有不一樣的答案,絕對是電路/硬體無法配合。可能是
你弄錯馬達特性,也可能是修改後的電路有問題。 不要信誓旦旦地保
證電路不會有錯誤, 如果您無法細心的檢查我想您可能到被當掉都找
不出原因。
※ 引述《wayn12342000 (阿菁)》之銘言:
: ※ [本文轉錄自 C_and_CPP 看板]
: 作者: wayn12342000 (阿菁) 看板: C_and_CPP
: 標題: [問題] C++求救!不知道問題在哪裡!!
: 時間: Sat Jul 18 21:40:13 2009
: 目前正在進行專題,
: 遇到一個很奇怪的問題,
: 我描述一下情況:
: 目前從學長那繼承一個由伺服馬達控制的機器人,
: 原有的控制方式是組語,
: 後來改用C控制,
: 但發生副程式無法動作的情況,
: 下面是控制方式
: 範例(組語):
: 略...
: mov r2,#50 ;給值50
: loop0:
: mov p2,00000001;丟值進P2.0 控制motor1
: call delay15 ;延遲1.5ms(角度一)
: mov p2,00000010;丟值進P2.1 控制motor2 同時將P2.0值=0
: call delay20 ;延遲2.0ms(角度二)
: call delay200 ;延遲20ms (滿足週期 驅動馬達動作)
: djnz r2,loop0
: 略...
: void hd1( int );宣告各部位副程式 頭
: void lh2( int ); 手
: 略...
: main()
: {
: int i;
: for(i=0;i<50;i++)
: {
: hd1( 45 );要求移向的角度
: }
: for(i=0;i<50;i++)
: {
: lh2( 45 );
: }
: }
: void hd1( int angle )
: {
: p1=00000001;
: angledelay( angle );
: }
: void lh2( int angle )
: {
: p1=00000010;
: angledelay( angle );
: }
: void angledelay( int angle )
--
作別人不願作的事,是好人!。 作別人不敢作的事,是壞人!。
作別人不能作的事,是天才!。 作別人不會作的事,是…腦殘!!
WolfLord
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.46.205.90
推
07/18 22:36, , 1F
07/18 22:36, 1F
→
07/18 22:37, , 2F
07/18 22:37, 2F
→
07/18 22:38, , 3F
07/18 22:38, 3F
→
07/18 22:38, , 4F
07/18 22:38, 4F
推
07/18 22:41, , 5F
07/18 22:41, 5F
→
07/18 22:41, , 6F
07/18 22:41, 6F
→
07/18 22:42, , 7F
07/18 22:42, 7F
那到底是哪一種馬達?
※ 編輯: WolfLord 來自: 114.46.205.90 (07/18 22:46)
推
07/18 22:47, , 8F
07/18 22:47, 8F
→
07/18 22:48, , 9F
07/18 22:48, 9F
伺服馬達並不是靠時間區隔驅動的喔~~
另外,把示波器接上去看,如果P1.1有信號,那就是你的馬達驅動方式有問題
如果P1.1沒信號,那就是線路有短路
※ 編輯: WolfLord 來自: 114.46.205.90 (07/18 22:53)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 4 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章