痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 7706|回復: 24

求助: 三向馬達驅動力量不足問題

[複製鏈接]
發表於 2016-5-28 11:07:40 | 顯示全部樓層 |閱讀模式
各位先進好:
     最近手癢摸到 硬碟機想驅動它轉動,本來想網路上找邏輯電路,一時沒找到,於是想用 MCU 來驅動,於是找來 STM8S03 和 ULN2003 驅動,網路上有 ARDUINO 版本的,看他的驅動程式和驅動影片發現很順,我的卻是力量不足,轉速不足... 想要請問先進們,如何增加它的力量和降低ULN2003的溫度,因為溫度升到攝氏60度以上....

線路:
    IMG_20160528_104010.jpg

驅動:目前驅動為 6步: STEP1 STEP2 STEP3 STEP4 STEP5 STEP6
    IMG_20160528_104320.jpg

原先設計驅動3步驅動: STEP1 STPE3 STEP5
  

麵包板測試(3歐姆限流)
IMG_20160526_160557.jpg

IMG_20160526_160551.jpg

IMG_20160526_160546.jpg

IMG_20160526_160606.jpg

現況1歐姆限流)
IMG_20160528_102701.jpg

IMG_20160528_102615.jpg

IMG_20160528_102625.jpg

網路的程式:

  1. The code is very simple, here is mine, I am not sure if I used this exact code in the video, you might need to tinker with it.

  2. int phase1 = 2;
  3. int phase2 = 3;
  4. int phase3 = 4;
  5. int led = 12;

  6. unsigned long stepLength = 40000;
  7. int minStepLength = 1400;
  8. int steps = 5;

  9. void setup() {
  10.   pinMode(led, OUTPUT);  
  11.   pinMode(phase1, OUTPUT);
  12.   pinMode(phase2, OUTPUT);
  13.   pinMode(phase3, OUTPUT);
  14.   digitalWrite(led, LOW);
  15. }

  16. void loop() {
  17.   switchStep(1);
  18.   switchStep(2);
  19.   switchStep(3);
  20.   
  21.   if(stepLength > minStepLength)
  22.   {
  23.     stepLength = stepLength - steps;
  24.   } else {
  25.     // set the minimum pulse length
  26.     stepLength=minStepLength;
  27.   }
  28.   
  29.   if (stepLength < 39950) {
  30.     digitalWrite(led, HIGH);   // second gear
  31.     steps = 300;
  32.   }
  33.    
  34.   if (stepLength < 20000) {
  35.     digitalWrite(led, LOW);      // third gear
  36.     steps = 50;
  37.   }

  38.   if (stepLength < 3000) {
  39.     digitalWrite(led, HIGH);      // fourth gear
  40.     steps = 2;
  41.   }
  42. }


  43. void switchStep(int stage)
  44. {
  45.   switch(stage)
  46.   {
  47.   case 1:
  48.     digitalWrite(phase1, HIGH);
  49.     digitalWrite(phase2, LOW);
  50.     digitalWrite(phase3, LOW);
  51.     myDelay(stepLength);
  52.     break;
  53.    
  54.   case 2:
  55.     digitalWrite(phase1, LOW);
  56.     digitalWrite(phase2, HIGH);
  57.     digitalWrite(phase3, LOW);
  58.     myDelay(stepLength);
  59.     break;
  60.    
  61.   default:
  62.     digitalWrite(phase1, LOW);
  63.     digitalWrite(phase2, LOW);
  64.     digitalWrite(phase3, HIGH);
  65.     myDelay(stepLength);
  66.     break;
  67.   }  


  68. }
複製代碼



我目前的程式:


  1. #include "stm8s.h"
  2. #include "stm8s_tim4.h"
  3. #include "global_defined.h"
  4. #include "stm8s_gpio.h"
  5. #include "stm8s_conf.h"
  6. #define coilPORT GPIOC
  7. #define inputPORT GPIOB
  8. #define speed_set GPIO_PIN_LNIB //read low 4bits data
  9. #define coil1 GPIO_PIN_1  //motor coil 1
  10. #define coil2 GPIO_PIN_2  //motor coil 2
  11. #define coil3 GPIO_PIN_7  //motor coil 3
  12. #define led_indicator GPIO_PIN_3  //LED indicator
  13. #define free_ext_run GPIO_PIN_7 //free_ext_run
  14. #define enable_pin GPIO_PIN_4
  15. #define DIR_pin GPIO_PIN_5
  16. #define CLK_pin GPIO_PIN_6
  17. u8 speed_delay_time;
  18. u8 speed_basic_data=23;
  19. u8 speed_parameter[]={0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150};
  20. u8 time_count_100us_flag;
  21. u8 free_run_flag;
  22. u8 free_run_set;//check sw free run is set

  23. void GPIOinit(void)//basic i/o setting
  24.         {
  25.         GPIO_Init(coilPORT,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);//coil port
  26.         GPIO_Init(inputPORT,GPIO_PIN_ALL,GPIO_MODE_IN_PU_NO_IT);//all input port
  27.         }

  28. void step_delay(u16 delay_100us)//motor coil step time delay if 7200rpm motor 1rotate 8.33ms 2.777ms per step
  29. {
  30.         while(delay_100us)
  31.         {
  32.                 if(time_count_100us_flag==1)
  33.                 {
  34.                  delay_100us -= 1;
  35.                  time_count_100us_flag=0;//timer flag reset
  36.          }
  37.         }
  38. }

  39. void switch_step(u8 stage)
  40. {
  41.         switch(stage)
  42.         {
  43.                 case 1:
  44.                 GPIO_WriteHigh(coilPORT,coil1);
  45.                 GPIO_WriteLow(coilPORT,coil2);
  46.                 GPIO_WriteLow(coilPORT,coil3);
  47.                 step_delay(30);//coil power on period
  48.                 GPIO_WriteLow(coilPORT,coil1);//turn off coil current
  49.                 break;
  50.                         case 2:
  51.                 GPIO_WriteLow(coilPORT,coil1);
  52.                 GPIO_WriteHigh(coilPORT,coil2);
  53.                 GPIO_WriteLow(coilPORT,coil3);
  54.                 step_delay(30);//coil power on period
  55.                         GPIO_WriteLow(coilPORT,coil2);//turn off coil current
  56.                 break;
  57.                 case 3:
  58.                 GPIO_WriteLow(coilPORT,coil1);
  59.                 GPIO_WriteLow(coilPORT,coil2);
  60.                 GPIO_WriteHigh(coilPORT,coil3);
  61.                 step_delay(30);//coil power on period
  62.                         GPIO_WriteLow(coilPORT,coil3);//turn off coil current               
  63.                 break;
  64.                
  65.                 case 11:
  66.                 GPIO_WriteHigh(coilPORT,coil1);
  67.                 GPIO_WriteLow(coilPORT,coil2);
  68.                 GPIO_WriteLow(coilPORT,coil3);
  69.                 step_delay(15);//coil power on period
  70.                 GPIO_WriteLow(coilPORT,coil1);//turn off coil current
  71.                 break;
  72.                         case 12:
  73.                 GPIO_WriteLow(coilPORT,coil1);
  74.                 GPIO_WriteHigh(coilPORT,coil2);
  75.                 GPIO_WriteLow(coilPORT,coil3);
  76.                 step_delay(15);//coil power on period
  77.                         GPIO_WriteLow(coilPORT,coil2);//turn off coil current
  78.                 break;
  79.                 case 13:
  80.                 GPIO_WriteLow(coilPORT,coil1);
  81.                 GPIO_WriteLow(coilPORT,coil2);
  82.                 GPIO_WriteHigh(coilPORT,coil3);
  83.                 step_delay(15);//coil power on period
  84.                         GPIO_WriteLow(coilPORT,coil3);//turn off coil current               
  85.                 break;               
  86.                
  87.                
  88.                
  89.                 case 21:
  90.                 GPIO_WriteHigh(coilPORT,coil1);
  91.                 GPIO_WriteHigh(coilPORT,coil2);
  92.                 GPIO_WriteLow(coilPORT,coil3);
  93.                 step_delay(15);//coil power on period
  94.                 GPIO_WriteLow(coilPORT,coil1);//turn off coil current
  95.                 break;               
  96.                                 case 22:
  97.                 GPIO_WriteLow(coilPORT,coil1);
  98.                 GPIO_WriteHigh(coilPORT,coil2);
  99.                 GPIO_WriteHigh(coilPORT,coil3);
  100.                 step_delay(15);//coil power on period
  101.                         GPIO_WriteLow(coilPORT,coil2);//turn off coil current
  102.                 break;
  103.                 case 23:
  104.                 GPIO_WriteHigh(coilPORT,coil1);
  105.                 GPIO_WriteLow(coilPORT,coil2);
  106.                 GPIO_WriteHigh(coilPORT,coil3);
  107.                 step_delay(15);//coil power on period
  108.                         GPIO_WriteLow(coilPORT,coil3);//turn off coil current               
  109.                 break;       
  110.        
  111.                
  112.                 }
  113. }
複製代碼
  1. //if delay time is 20ms it mean rpm=999rpm
  2. //if delay time is 3.3ms then rpm=6000rpm
  3. u8 speed_sw_select(void)//read speed sw data
  4. {
  5.         u8 speed_set_read;
  6.         speed_set_read = GPIO_ReadInputPin(inputPORT,speed_set);
  7.         return speed_set_read;
  8. }

  9. void start_up_running(void)
  10. {
  11.         u16 speed_delay_time_startup = 300;
  12.         u8 speed_temp;
  13.         speed_temp = speed_sw_select();
  14.         speed_delay_time = speed_parameter[speed_temp]+speed_basic_data+10;
  15.        
  16.         while (speed_delay_time_startup > (speed_delay_time) )
  17.         {
  18.         switch_step(11);
  19.         step_delay(speed_delay_time_startup);
  20.         switch_step(21);
  21.         step_delay(speed_delay_time_startup);
  22.         switch_step(12);
  23.         step_delay(speed_delay_time_startup);
  24.         switch_step(22);
  25.         step_delay(speed_delay_time_startup);
  26.         switch_step(13);
  27.         step_delay(speed_delay_time_startup);
  28.         switch_step(23);
  29.         step_delay(speed_delay_time_startup);       
  30.         speed_delay_time_startup -=  10;
  31.         }
  32.        
  33.         free_run_flag=1;
  34. }


  35. void free_run (void)
  36. //power on free run speed depend on speed sw setting 4bit setint increase delay time by 1ms step if set 0000 then 3.3ms and speed will keep in 6000RPM if set 1111 then speed keep in 1000 RPM
  37. {
  38.         u8 speed_temp;
  39.         speed_temp = speed_sw_select();
  40.         speed_delay_time = speed_parameter[speed_temp]+speed_basic_data;
  41.         //20160527 change to step(11~23)
  42.         switch_step(11);
  43.         step_delay(speed_delay_time);
  44.        
  45.         switch_step(21);
  46.         step_delay(speed_delay_time);
  47.        
  48.         switch_step(12);
  49.         step_delay(speed_delay_time);

  50.         switch_step(22);
  51.         step_delay(speed_delay_time);
  52.        
  53.         switch_step(13);
  54.         step_delay(speed_delay_time);
  55.        
  56.         switch_step(23);
  57.         step_delay(speed_delay_time);
  58.        
  59. }
  60. //-----^^^^^^^^  20160525  ^^^^^^----------




  61. void tim4init(void)
  62. {
  63.         TIM4_TimeBaseInit(TIM4_PRESCALER_8,25);//TIM4_PRESCALER_8 TIM6_TimeBaseInit
  64.         TIM4_SetCounter(250);
  65.         TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);//2Mhz/8/25
  66.         TIM4_Cmd(ENABLE);//one interrupt 0.1ms
  67. }

  68. void tim4svc(void)
  69. {
  70.         time_count_100us_flag=1;

  71.         TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  72. }


  73. //--------------------------------------------------------------------------
  74. /*
  75. @far @interrupt void TIM1_OVF_IRQ(void)
  76. {
  77.         tim1svc();
  78. }

  79. @far @interrupt void TIM5_OVF_IRQ(void)
  80. {
  81.         tim5svc();
  82. }
  83. */
  84. @far @interrupt void TIM4_OVF_IRQ(void)
  85. {
  86.         tim4svc();
  87. }


  88. void main(void)
  89. {
  90.         GPIOinit();//basic i/o setting
  91.   tim4init();// this is delay time set
  92.         rim();       
  93.   free_run_flag=0;
  94.        
  95.         if (GPIO_ReadInputPin(inputPORT,free_ext_run)==0)
  96.            free_run_set = 1;
  97.        
  98.         while(free_run_set)
  99.         {

  100.                         {
  101.                                 if(free_run_flag==0)
  102.                                 {
  103.                                         start_up_running();
  104.                                 }
  105.                
  106.                                 else
  107.                                         free_run ();
  108.                         }
  109.   }
  110. }

複製代碼

IMG_20160528_102630.jpg
發表於 2016-5-28 11:32:32 | 顯示全部樓層
用ULN2003 驅動馬達的確比較不足,一定要用ULN2003 實驗的話,你可以用疊羅漢的方式,把兩個ULN2003 並成一個試試。
 樓主| 發表於 2016-5-28 13:00:05 | 顯示全部樓層
wish 發表於 2016-5-28 11:32 AM
用ULN2003 驅動馬達的確比較不足,一定要用ULN2003 實驗的話,你可以用疊羅漢的方式,把兩個ULN2003 並成一 ...

感謝WISH大的寶貴經驗!!
發表於 2016-5-28 13:38:45 | 顯示全部樓層
本文章最後由 ciko.ciko 於 2016-5-28 01:40 PM 編輯
antlu 發表於 2016-5-28 01:00 PM
感謝WISH大的寶貴經驗!!


可使用L298N驅動板.我有一片.
Arduino_UNO_L298N.jpg

L298.jpg
發表於 2016-5-28 14:16:10 | 顯示全部樓層
本文章最後由 bobbie_168 於 2016-5-28 02:20 PM 編輯

推力都不足了,馬達前面有一電阻可以拿掉會好一些
可以改用專用IC或是電流大的MOS電晶體之類當推動
發表於 2016-5-28 15:41:28 | 顯示全部樓層
本文章最後由 duke83 於 2016-5-28 03:48 PM 編輯

幾乎每個人手邊都有硬碟可以殺料,我也拆了好幾顆馬達出來玩,原以為要驅動馬達應該不是難事,況且手邊又有三相大電流驅動板。
1.jpg
這是以前的剩料,用一顆 4017 去除三產生三相脈波去驅動三組對稱互補的中功率晶體,只要調整震盪頻率就能改變轉速,但實際用硬碟馬達來使用很不理想,不易啟動又很沒力。

於是又看到這個電路,要改驅動方式可能會比較好。
2.gif

但是又懶得改線路於是去買個專用驅動模組比較簡單。
3.jpg
5V 或 12V 都能用,可接三線或四線式,能正反轉當然也能調速。
工作起來當然很滿意,小小一顆驅動 IC 也不會熱,轉速好調整扭力也夠,可以準備來當砂輪機了。

上示波器來觀察一下,原來此顆被磨掉編號的專用 IC 輸出是模擬成正弦波輸出,轉速跟頻率高低相對應,下圖是最高速時的波形。
4.jpg


ULN 2003 的 Vce(set) 很高(約 1V)不合適做大電流輸出,建議改成如圖二的相差 60 度角六步方波輸出結構。

評分

5

查看全部評分

發表於 2016-5-28 16:49:33 | 顯示全部樓層
本文章最後由 arthur0518 於 2016-5-28 04:51 PM 編輯
duke83 發表於 2016-5-28 03:41 PM
幾乎每個人手邊都有硬碟可以殺料,我也拆了好幾顆馬達出來玩,原以為要驅動馬達應該不是難事,況且手邊又有 ...


這個專用驅動模組...最近我也買了....
這顆被磨掉編號的專用 IC...上面的編號是
11873
48TG4
CFD9

我這塊...是另一顆IC(16 PIN)....編號被磨掉了...


TB2ab.jpg

評分

5

查看全部評分

 樓主| 發表於 2016-5-28 19:17:48 | 顯示全部樓層
duke83 發表於 2016-5-28 03:41 PM
幾乎每個人手邊都有硬碟可以殺料,我也拆了好幾顆馬達出來玩,原以為要驅動馬達應該不是難事,況且手邊又有 ...

感謝duke83大的說明和資料分享,找時間用mos 來推看看!!
 樓主| 發表於 2016-5-29 19:33:06 | 顯示全部樓層
duke83 發表於 2016-5-28 03:41 PM
幾乎每個人手邊都有硬碟可以殺料,我也拆了好幾顆馬達出來玩,原以為要驅動馬達應該不是難事,況且手邊又有 ...

duke大:
  更換 ULN2003 換成 3個T60N2R MOSFET之後現在溫度已經維持在 31度左右,感謝!!
發表於 2016-5-29 20:30:38 | 顯示全部樓層
antlu 發表於 2016-5-29 07:33 PM
duke大:
  更換 ULN2003 換成 3個T60N2R MOSFET之後現在溫度已經維持在 31度左右,感謝!! ...

手腳真快,ㄧ下子就換好 MOS 晶體了,這下效率提高了但不知扭力是否正常?
發表於 2016-5-29 21:10:53 | 顯示全部樓層
本文章最後由 duke83 於 2016-5-29 09:46 PM 編輯

六樓我有提到看過小板子的驅動波形是接近於正弦波輸出,正弦波的確是比較理想的驅動方式,比方波效率更高更符合電機的物理特性,且因為無諧波成分所以變得更安靜了,響應反應快等項優點。

我也有在玩遙控模型,所以手邊也有好幾顆所謂的電變(電子變速器),現今遙控界的動力大都採用無刷馬達,這種無刷馬達也是三相馬達,想要來推動這個小小硬碟馬達也可拿現成的高功率電變來驅動,只是輸入控制訊號是 1.0mS ~ 2.0mS 的 PWM 訊號,無法直接用 VR 來控制轉速。
30A-2.jpg

又剛好看到模型界有人在討論最新技術的 “無感 FOC 正弦驅動” ,現在很夯的多轴飛行器對馬達與電力的依重比例很高,更有效率與優良的驅動三相馬達是一件最重要的事了。
FOC 的原理我還沒完全弄懂不太會解釋,直接從對岸的討論區貼文字過來
http://bbs.5imx.com/forum.php?mod=viewthread&tid=1131041&extra=page%3D1
FOC 是磁場定向控制的英文縮寫,我們知道:電機分為定子和轉子,兩者之間依靠磁場的相互作用而旋轉,根據初中物理課程可以知道,當定子和轉子磁場呈90度夾角時,力矩最大,那麼可以推知,如果能夠知道轉子的位置,讓生成的定子磁場始終保持與轉子磁場呈90正交是最好的!所以在這裡,我們就知道FOC(磁場定向控制)就是可以按照我們的要求生成指定方向的定子磁場的技術。這樣一來,通過使用空間矢量調制技術,馬達電流將以正弦電流形式表現,這就意味著馬達將會以近乎無聲的方式運行,完全沒有方波電調所具有的惱人的噪音。另外,電調以上千赫茲的頻率對電流進行調整,使得無感FOC電調的響應能力遠超方波電調。因為FOC控制技術以前是應用於高端位置伺服控制,隨著高性能微控制器的出現,無感FOC控制技術開始慢慢廣泛應用起來,但是作為航模電調,無感方波一直佔據統治地位,自從大疆發佈以來,還沒有第二家電調廠家公開發佈此種電調,可見技術難度之高,彷彿當年之無感方波電調的難度(快十年了,也只有好硬才真正做的不錯!能夠不斷推出新品,包括模型界最新的同步整流式無感方波電調)

實際應用:


FOC 技術說明:

有點難度我也還沒看懂!

中文簡介:
http://blog.udn.com/hal9678/6714149

這是最新技術電動車輛也須用此技術,有需要與有興趣的人可以關注一下。

評分

1

查看全部評分

發表於 2016-5-29 22:35:23 | 顯示全部樓層
STM 好像有DAC, 試試看用軟件 DDS, 輸出三相的SINE訊號, 驅動會容易.
低頻的DDS可以參考這個,
https://web.archive.org/web/2012 ... r/minidds/index.htm
加上STM硬件DAC, 不會很難達成, 不過驅動線路要自己搭
發表於 2016-5-29 23:17:22 | 顯示全部樓層
本文章最後由 duke83 於 2016-5-29 11:22 PM 編輯

三相馬達的驅動即使是現今的方波驅動外都還需有配置感應器或感應接口,三相輸出與三相輸入是相對應的,可以再看這張圖 MPU 有六個輸出與三個 A B C 輸入,這讓我想到晶體測試器的電路也是三線輸出與三線輸入所以才能做那麼多事。
151652uwmlly8l33z2t74o.gif

早期的無刷電機內部有裝霍爾感應器,檢知轉子的位置來改變驅動脈波的寬度以獲得最大的馬達扭力。
現在的無刷電機省略感應器又稱為無感馬達,利用電機的反電動勢與 MPU 的演算來正確的運轉馬達。
正弦波 FOC 的演算更是複雜,對我這種數學不好又不會寫程式的人實在是很頭痛,只能期望以後能多出一些專用 IC 與商品讓我能夠買來用就很滿足了。

要讓無刷三相馬達能夠運轉是一回事,要讓她運轉的好又是另一回事,期待有心人多方面的實驗。
發表於 2016-5-30 10:21:39 | 顯示全部樓層
MCP8063
低壓三相無感直流無刷馬達控制驅動IC

《icshop4》MCP8063-E/MD → 12V, 3-PHASE FULL-WAVE MOTOR DRIVERS●2448514●
http://goods.ruten.com.tw/item/show?21618639110019
Noname.jpg

MCP8063 三相無刷.pdf

575.7 KB, 下載次數: 15

 樓主| 發表於 2016-5-30 10:36:17 | 顯示全部樓層
duke83 發表於 2016-5-29 08:30 PM
手腳真快,ㄧ下子就換好 MOS 晶體了,這下效率提高了但不知扭力是否正常? ...

因為是退休人士所以可以行動快一點!! 扭力我沒有比較,因為 ULN2003 溫度一下子救升65度以上到,我把碟片裝上去程式不變的情況下,應該沒甚麼變化!! 倒是可以把限流電阻取消,扭力有上升,部分設定轉速可以旋轉,但是,因為設定只有激磁1.5ms 所以會抖動的現象!!
 樓主| 發表於 2016-5-30 10:58:18 | 顯示全部樓層
xiaolaba 發表於 2016-5-29 10:35 PM
STM 好像有DAC, 試試看用軟件 DDS, 輸出三相的SINE訊號, 驅動會容易.
低頻的DDS可以參考這個,
https://web. ...

XIAOLABA大:
    感謝!! 這DDS 似乎就是使用 R2R作出正弦波的動作,驅動MOS不知道容不容易,我完全沒有經驗!! 不過程式上好像也不太好寫...努力喔!!
 樓主| 發表於 2016-5-30 11:36:35 | 顯示全部樓層
duke83 發表於 2016-5-29 09:10 PM
六樓我有提到看過小板子的驅動波形是接近於正弦波輸出,正弦波的確是比較理想的驅動方式,比方波效率更高更 ...

這電變多年前也買了一個,也買了一個無刷,但是,因為 沒有 PWM 調變電路所以現在不知道躺在哪裡(休息), FOC 太複雜了,只能嘆為觀止!! 倒是 我這東西可以把 PWM輸出程式練習寫出來,這樣可以把躺在多年的電變找出來!!
 樓主| 發表於 2016-5-30 11:48:05 | 顯示全部樓層
雄爸爸 發表於 2016-5-30 10:21 AM
MCP8063
低壓三相無感直流無刷馬達控制驅動IC

雄爸:
   勸敗!! 哈哈哈,電機這部分是我的弱項,玩一般仿造可以,進階就不行了,記得幾年前 LEGION大有自繞變壓器,我也仿卻稿的電晶體燒燙燙!!
發表於 2016-5-30 11:59:30 | 顯示全部樓層
antlu 發表於 2016-5-30 10:58 AM
XIAOLABA大:
    感謝!! 這DDS 似乎就是使用 R2R作出正弦波的動作,驅動MOS不知道容不容易,我完全沒有經驗 ...

呂大, 你若有報廢的HD, 可轉就好了, 5400 和 7200 各找一個, 上電看看他的馬達的3相波形就容易了解.
MCU有3路DAC就很容易. 用R2R的話簡單的要24BIT, 3個PORT.
1個8BIT的SINE表格, 作者那個已經做好. 如果你的DAC是10BIT或者12BIT, 自己用EXCEL做一個就可以.
初始化時每相差120度, 3 個phase_accumulator, 0度, 120度, 240度, 自然就有三相訊號. 先做好驅動訊號再考慮實際驅動, 比較容易成功.
驅動的話用星型比較容易, 一般HD都是星型, 不用H-橋.
發表於 2016-5-30 14:13:32 | 顯示全部樓層
antlu 發表於 2016-5-30 11:36 AM
這電變多年前也買了一個,也買了一個無刷,但是,因為 沒有 PWM 調變電路所以現在不知道躺在哪裡(休息), FOC ...

Arduino 筆記 – Lab16 使用可變電阻控制伺服馬達
http://coopermaa2nd.blogspot.tw/2011/01/arduino-lab16.html

記得我之前好像就是用這個
產生PWM給直流電變
驅動HD的三相馬達的
 樓主| 發表於 2016-5-30 16:11:02 | 顯示全部樓層
xiaolaba 發表於 2016-5-30 11:59 AM
呂大, 你若有報廢的HD, 可轉就好了, 5400 和 7200 各找一個, 上電看看他的馬達的3相波形就容易了解.
MCU ...

xiaolaba大:
   感謝!! 想想怎麼會比較省事!! 或許手中有其他DAC晶片!!
發表於 2016-5-30 16:56:27 | 顯示全部樓層
維基百科,自由的百科全書
向量控制(vector control)也稱為磁場導向控制(field-oriented control,簡稱FOC),是一種利用變頻器(VFD)控制三相交流馬達的技術,利用調整變頻器的輸出頻率、輸出電壓的大小及角度,來控制馬達的輸出[1][2]。其特性是可以個別控制馬達的的磁場及轉矩,類似他激式直流馬達的特性。由於處理時會將三相輸出電流及電壓以向量來表示,因此稱為向量控制。

向量控制可以適用在交流感應馬達及直流無刷馬達[3],早期開發的目的為了高性能的馬達應用,可以在整個頻率範圍內運轉、馬達零速時可以輸出額定轉矩、且可以快速的加減速。不過相較於直流馬達,向量控制可配合交流馬達使用,馬達體積小,成本及能耗都較低,因此開始受到產業界的關注。向量控制除了用在高性能的馬達應用場合外,也已用在一些家電的應用中[4]。

這控制功夫高深,比一般變頻器還要高級,還有用專用運算控制器,可以好好研究!
 樓主| 發表於 2016-5-30 19:25:40 | 顯示全部樓層
雄爸爸 發表於 2016-5-30 02:13 PM
Arduino 筆記 – Lab16 使用可變電阻控制伺服馬達
http://coopermaa2nd.blogspot.tw/2011/01/arduino-la ...

感謝雄爸提供訊息!!
發表於 2016-5-30 21:40:18 | 顯示全部樓層
如果手邊有模型電變事情就變簡單了,只要再有 PWM 信號就行了。

一、最簡單的 555 電路。
20110425_75386365b9dc69280efcQ9tixt4W5t3X.gif.jpeg

二、現成的舵機測試器。
images.jpeg
我自己是用這種有脈波寬度顯示還能自動變化脈波寬度,調整模型的上下行程很方便。

三、Arduino 程式範例內就有兩個現成的可以用,直接套用或修改都成。
111.jpg
 樓主| 發表於 2016-5-31 00:19:01 | 顯示全部樓層
duke83 發表於 2016-5-30 09:40 PM
如果手邊有模型電變事情就變簡單了,只要再有 PWM 信號就行了。

一、最簡單的 555 電路。

DUKE大:
   感謝提供寶貴資料,會常是使用 STM8來做. 雖然 ARDUINO 手頭上也有,目前也有 一大堆DAC0800 可以做出類比正弦波就要看程式功力了...
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-4-24 11:47 AM , Processed in 0.114530 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.