Einen Servo und/oder einen Motor mit einem Poti ansteuern

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Einen Servo und/oder einen Motor mit einem Poti ansteuern

      Nabend, es sollte ein einfacher Test werden wie gut so etwas funktioniert, ein Servo mit einem Poti bewegen und bei einem Motor die Drehzahl mit einem Poti verändern das war es auch schon.

      Das Programm funktionierte leider nicht mit pulseout für den Motor und servo(1) für das Servo, wer da wenn nicht mag weiß ich nicht ;( . Also wurde das Programm ohne pulseout geschrieben, was für mich die einfachste Lösung war.

      Wenn Jemand eine Idee hat wie es auch mit pulseout funktioniert, immer her damit irgendwo muß ja mein Fehler sein.

      So sieht das Programm ohne pulseout aus:

      BASCOM-Quellcode

      1. ' Compiler: Bascom 2.0.7.5
      2. '
      3. ' Dateiname: Potis-Servo-Motor A85.avr
      4. ' Funktion: mit einem Poti einen Servo ansteuern oder von einem Motor die Drehzahl verändern
      5. ' Datum: Start 10.03.2020, Stand 10.03.2020
      6. ' Von: Naubaddi
      7. '
      8. ' ATtiny85 (B.0 nur Ausgang, C.3 nur Eingang)
      9. '
      10. ' +---v---+
      11. ' PCINT5/RESET/ADC0/dW B.5 |1 8| VCC
      12. ' PCINT3/XTAL1/CLKI/OC1B/ADC3 B.3 |2 7| B.2 SCK/USCK/SCL/ADC1/T0/INT0/PCINT2
      13. ' PCINT4/XTAL2/CLKO/OC1B/ADC2 B.4 |3 6| B.1 MISO/DO/AIN1/OC0B/OC1A/PCINT1
      14. ' GND |4 5| B.0 MOSI/DI/SDA/AIN0/OC0A/OC1A/AREF/PCINT0
      15. ' +-------+
      16. '
      17. ' --- Mikrocontroler Daten... ----------------------------------------------------------------------------------
      18. $regfile = "attiny85.dat"
      19. $crystal = 8000000
      20. $hwstack = 16
      21. $swstack = 16
      22. $framesize = 16
      23. ' &HFF, &H62, &HDF, &HFF ' 1MHz
      24. $PROG &HFF, &HE2, &HDF, &HFF ' 8MHz
      25. ' --- Deklarationen... -----------------------------------------------------------------------------------------
      26. config servos = 1 , servo1 = portb.0 , reload = 10
      27. config portb.0 = output ' Servo
      28. config portb.1 = output ' Motor
      29. config adc = single , prescaler = auto , reference = avcc
      30. config portb.3 = input ' Servo-Poti
      31. config portb.4 = input ' Motor-Poti
      32. enable interrupts
      33. ' --- Variablen, Alias... --------------------------------------------------------------------------------------
      34. dim Poti_Servo as word
      35. dim Servowert as byte
      36. dim Servo_alt as byte
      37. dim Dummer as word
      38. dim Poti_Motor as word
      39. dim an as word
      40. dim aus as word
      41. ' --- Vorbelegung der Variablen und Alias... -------------------------------------------------------------------
      42. const Faktor = 11.130 ' Servobereich 53-145 = 92 (1024Bit : 92 = 11.130)
      43. Motor alias portb.1 ' der Ausgang Nr. 1 für den Motor
      44. an = 0 ' die an-Zeit für den Motor
      45. aus = 1023 ' die aus-Zeit für den Motor
      46. ' --- Programm Anfang ------------------------------------------------------------------------------------------
      47. do
      48. Poti_Motor = getadc(2)
      49. an = Poti_Motor
      50. aus = 1023 - Poti_Motor
      51. Motor = 1
      52. waitus an
      53. Motor = 0
      54. waitus aus
      55. Poti_Servo = getadc(3)
      56. Dummer = Poti_Servo / Faktor
      57. Servowert = Dummer + 54
      58. if Servowert <> Servo_alt then
      59. Servo_alt = Servowert
      60. Servo(1) = Servowert
      61. endif
      62. loop
      63. ' --- Programm Ende --------------------------------------------------------------------------------------------
      64. end
      65. ' --------------------------------------------------------------------------------------------------------------
      Alles anzeigen

      Grüßle, Naubaddi
    • Das Problem ist "ich finde den pwm Befehl nicht in der BASCOM-Hilfe", darum ein Versuch mit pulseout der gescheitert ist.

      Der Motor wird über einen BS170 der 500mA vertragen kann angesteuert, habe da eine kleine Platine gebastelt die X Volt für den Motor bereitstellt und mit 5V angesteuert wird.

      Die Platine für eine externe Spannung für den Motor:
      Platine.jpg
      Grüßle, Naubaddi
    • Dein Layout ist, ähh, suboptimal.
      Ein Schaltplan wäre übersichtlicher gewesen.
      Zumal du keine Daten der Bauteile oder Anschlussbezeichnungen dran geschrieben hast.
      Die 5V über A3 sollen vermutlich der PWM-Eingang sein.
      Dann wird das Signal über einen Spannungsteiler an das Gate geführt.
      Du hast eh wenig Spannung, warum noch weniger? Das schmälert auch den Strom, den du durch schicken kannst. Bei 5 Ohm R_ds kommt der kleine mächtig ins Schwitzen, bei 260mA ist da Schluss, weil P_max für's Gehäuse erreicht ist (wenn ich noch rechnen kann)

      Hardware-PWM kann der Attiny85 an 4 verschiedenen Pins und 2 verschiedenen Timern.

      Unter Config Timer in der Hilfe findest du bestimmt was, die Hilfe ist nicht so schlecht, wie mancher denkt.

      Bascom gibt es in Version 2.0.8.2 oder hast du die Demo?
    • sicher?
      Wenn der BS170 schließt, sollen die zwei Gnds verbunden werden?
      Für mein Gefühl müssten beide Gnds verbunden sein und der Motor parallel zur Diode.

      Für das PWM braucht man keinen Befehl, weil im Programm eine einfache, kurze Zuweisung reicht.

      'to set the PWM registers, just assign a value to the compare A and B registers
      Compare1a = 100
      Compare1b = 200
      'Or for better reading :
      Pwm1a = 100
      Pwm1b = 200

      Was willst Du da noch kürzer machen?
    • Naubaddi schrieb:

      dann gibt es also keinen Befehl wie "pwmout Port, 1024, 512"
      nein, so was gibt es nicht.

      Naubaddi schrieb:

      mit einem Timer basteln?
      der Timer selbst hat eine Hardware-Einheit, die PWM kann. Du gibst die Pulsweite vor und es kommt eine PWM raus, das läuft alleine, unabhängig vom Rest des Programms.

      Natürlich kannst du auch eine PWM in Software machen, mit einem Timerinterrupt z.B. oder ganz banal in der Hauptschleife, wie dein Ansatz zeigt.

      In Hardware-PWM sieht das so aus:

      Config Portb.0 = Output
      Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
      Pwm0a = 67

      An Pin5 kommt dann die PWM raus.

      Naubaddi schrieb:

      Ist es so besser?:
      Ja.
      Den 1k Widerstand würde ich weg lassen oder auf höchstens 120 Ohm setzen. Der FET soll schnell schalten. Zum Testen ist eine LED (mit Vorwiderstand) natürlich besser.

      Ich denke, du bist noch recht am Anfang deiner Programmierer-Karriere.
      Deshalb einen ernst gemeinten Rat:
      Benutze den Atmega328P als Prozessor deiner Wahl und für Spielereien. Er hat genug Speicher und Pins für 80% der Anwendungen und dazu hat er den Atmega-Kern, also Kleinigkeiten wie Hardware-Multiplizierer und noch einige andere Annehmlichkeiten.
      Attinys sind eher was für Fortgeschrittene, die die Grenzen schon kennen.
      Der Atmega328P kommt sehr preiswert als Arduino Nano oder Uno inklusive Board und Bootloader daher, es wird also nicht mal ein Programmiergerät gebraucht.

      Setz bitte auch erstmal die Stackwerte höher:
      $swstack = 32
      $hwstack = 32
      $framesize = 40

      Benutzt du die Demo von Bascom?
    • Mahlzeit,

      stefanhamburg schrieb:

      ...Was willst Du da noch kürzer machen?...
      nicht kürzer machen, es geht ums Verstehen was man machen kann wie hier z.B. PMW. Wenn es einen Befehl gibt der gut funktioniert brauche ich den nicht selber basteln, so wie mein PWM oben im Programm.

      Michael schrieb:

      ...Ich denke, du bist noch recht am Anfang deiner Programmierer-Karriere...
      bei den AVRs ja, ansonsten sind es schon ein paar Jahrzehnte ;-).

      Ein paar Atmega8, Atmega328P liegen hier auch rum, die sind für meine Basteleien definitiv viel zu groß. Es sollte alles so klein wie möglich sein, da bei den RC-Modellen oft sehr wenig Platz für die Elektrik ist.

      So sieht z.B. ein RC-Modell aus was recht klein ist (ca. 14cm lang), 2 Holz Schaschlikspieße, ein paar Räder und der Rest ist die Elektrik. Es hat einen 4 Kanal Empfänger für vorwärts/rückwärts mit Fahrtregler, rechts/links mit Servo, Licht an/aus und die Hupe mit einem PICAXE.

      01 DR1 mit Fahrer.jpg

      Und der PICAXE 08M2 (mit Programmierbuchse) für das Licht und die Hupe:
      Licht und Hupe RC-Modul.jpg

      Ja es ist die DemoVersion von Bascom, sollte erst mal reichen für meine ersten Schritte mit den AVRs.

      Grüßle, Naubaddi
    • Hallo Naubaddi,
      sieht ja süß aus.
      Ich habe mir angewöhnt, nicht direkt auf den Tiny13A zu entwickeln, die ich für die meisten Funksachen im Haus benutze. Da ist debuggen meist aufwendig wegen fehlender Anschlüsse und Flash.
      Wenn ich weiß, dass ich mit den HW Gegebenheiten (Anzahl Pins, Timer usw.) hinkomme, entwickle ich in der Regel auf einem M8 oder M32. Da kann man schön mit HW Print ausgeben ohne dauernd an irgendwelche Beschränkungen zu kommen.
      Erst wenn alles funktioniert kümmere ich mich darum, dass auf die Ziel HW zu bringen. Dabei ist es dann manchmal knapp mit dem Flash, aber das habe ich immer schon ein wenig vorher im Blick sodass keine bösen Überraschungen komen sollten.