Altera De0 Nano ile Servo Motor Sürme

Servo motorlarda,PWM adı verilen Darbe Genişlik Modülasyonu tekniği sayesinde noktadan noktaya konum-hız-ivme kontrolü yapılabilmektedir.

Uygulamada kullanacağımız servo motor piyasada rahatlıkla bulunabilen ve oldukça ucuz olan Tower Pro adlı üreticinim Sg90 modelli ürünüdür.

Servo motorun datasheetini incelediğimizde PWM aralığının 20 ms, maksimum duty cycle değerinin 2 ms, minimum duty cycle değerinin ise 1 ms olduğunu görmekteyiz.

pwm

Uygulamada kullanacağımız kartın (Altera De0 Nano) clock hızı 50 Mhz e göre PWM hesabı yapacak olursak;
50 MHz = 20 ns , Servo motorumuz için PWM periyodu 20 ms,
Tanımlayacağımız counter değişkenimizin üst limiti 20 ms / 20 ns = 1*10^6 olur.
Duty cycle max değeri 2 ms / 20 ns = 1* 10^5
Duty cycle min değeri 1 ms / 20 ns = 5* 10^4 olur.
Bu değerlere göre kodumuzu yazacak olursak;

 

  1. var quads_screen_width = document.body.clientWidth;
  2. if ( quads_screen_width >= 1140 ) {
  3. /* desktop monitors */
  4. document.write('');
  5. (adsbygoogle = window.adsbygoogle || []).push({});
  6. }if ( quads_screen_width >= 1024 && quads_screen_width < 1140 ) {
  7. /* tablet landscape */
  8. document.write('');
  9. (adsbygoogle = window.adsbygoogle || []).push({});
  10. }if ( quads_screen_width >= 768 && quads_screen_width < 1024 ) {
  11. /* tablet portrait */
  12. document.write('');
  13. (adsbygoogle = window.adsbygoogle || []).push({});
  14. }if ( quads_screen_width < 768 ) {
  15. /* phone */
  16. document.write('');
  17. (adsbygoogle = window.adsbygoogle || []).push({});
  18. }
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. library IEEE;
  26. use IEEE.STD_LOGIC_1164.ALL;
  27. entity pwm_servo is
  28. Generic(
  29. count_max : integer := 1000000;
  30. duty_max : integer := 100000;
  31. duty_min : integer := 50000;
  32. duty_delta : integer := 200
  33. );
  34. Port( CLK : in STD_LOGIC;
  35. PWM : out std_logic
  36. );
  37. end pwm_servo;
  38.  
  39. architecture Behavioral of pwm_servo is
  40.  
  41. signal counter: integer range 0 to count_max := 0;
  42. signal duty : integer range duty_min to duty_max := duty_min;
  43. begin
  44. prescaler: process(all)
  45. variable direction_up : boolean := true;
  46. begin
  47. if rising_edge(clk) then
  48. if counter < count_max then
  49. counter <= counter + 1;
  50. else
  51. if direction_up then
  52. if duty < duty_max then
  53. duty <= duty + duty_delta;
  54. else
  55. direction_up := false;
  56. end if;
  57. else
  58. if duty > duty_min then
  59. duty <= duty - duty_delta;
  60. else
  61. direction_up := true;
  62. end if;
  63. end if;
  64. counter <= 0;
  65. end if;
  66. end if;
  67. end process;
  68. pwm_s: process(all)
  69. begin
  70. if counter < duty then
  71. pwm <= '1';
  72. else
  73. pwm <= '0';
  74. end if;
  75. end process;
  76. end Behavioral;

 

Yorum

  1. By Furkan

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

  2. By Serkan Öztürk

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

      • By Oğuz ŞANLI

        Cevapla

        • By Oğuzhan Gültekin

          Cevapla

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir