Software und Hardware für Solarflieger

Hallo Robbin
Nicht ganz
Leerlauf ist etwa 10V, Vollgas ist etwa 4V, jeh nach Widerständen.
Jeh mehr Gas Du gibst, jeh geringer wird die Soll Spannung.

Am einfachsten; Voltmeter rann, Knüppel im Leerlauf, Servowegeanzeige auf das Senderdisplay, und anknipsen. Dann langsam Gas geben, und das Voltmeter beobachten, der Motor fängt irgendwann erst an zu raappeln, da die Sollspannung noch zu hoch ist, dann gehts los, und langsam immer weiter, bis Du bei 7,3-7,4Volt bist. Den Wert auf dem Sender erstmal merken, und als Vollgasstellung proggen.
Dann Feintuning, Wattmeter, direkt zu Vollgas, das geht dann ohne rappeln, und ein bissl mit der Servoweg-Endstellung spielen, und den Wert mit der höchsten Leisung suchen. Im Zweifelsfall (gut ist von - bis..) eher in Richtung geringerer Spannung.
 
MPP Diskussion

MPP Diskussion

Moiens,

ich glaube da sollten wir mal drüber fachsimpeln.
Mangels Zeit und Sonne habe ich meine Fläche (12Zeller) noch nicht intensiv vermessen können.
Grundsätzlich habe ich da noch ein paar Gedankenfehler, so glaube ich.
Ansätze:
- der MPP liegt bei jeder unserer Flächen an anderen Punkten. (würde man sie nebeneinanderlegen - gleiche Sonnenwinkel usw...)
Durch unterschiedliche Zellenqualitäten, dürfte da etwas an Unterschieden rauskommen
- ebenfalls durch Unterschiede in Zellen, Beglasung , Verlötungen, Kabel- und Übergangswiderstände dürfte sich der dabei einstellende Strom und damit die ausbeutbare Leistung insgesamt um evtl. +/- 2bis4 Watt streuen (gleiche Verhältnisse vorausgesetzt .. (blosse Annahme ..) nur um einen Vergleich anstreben zu können.
Ich hab ja definitiv schlechtere Zellen als Holger, schlechtere Oberfläche, und und und ....

Was resultiert also: ich habe weniger Leistung zur Verfügung als Holger , selbst wenn beide Systeme perfekt am MPP eingeregelt sind. Was also tuen ? Nichts.
Entweder meine Leistung langt für meinen Flieger (entweder satt oder dünne aber fliegbar irgendwie - seinen Luftwiderstand und Gewicht - oder halt nicht. Wann kann ich bestenfalls ändern ? Motor KV anpassen oder Prop .
Habe ich halt ne KRASSE Fehlanpassung und würde meine Motor-Prop Kombination sowas von in den Keller, wird mir auch die beste Fläche vermutlich nicht weiterhelfen.
Soviel besser wird die dann auch nicht mehr sein können.

Die Sonneneinstrahlung wäre stark reduziert:
Was passiert ? Die Spannung des MPP sinkt wohl ab, statt angenommen 6.2 Volt bei Topkonditionen und 5A , sind es dann nur noch 5,4 V und 3A.
Die Regelung wird versuchen, die Spannung um maximal, also um 5.4V zu halten, ernten kann trotzdem nur max. 3A .Eventuell für einen Steigflug zuwenig.
Resultat: man schmeisst den Geier, und aus 1,7m Abwurfhöhe gehts gerade aus bis zum Aufsetzen notgedrungen ohne Kurve, nach 50 Metern.
Muss man sich halt rantasten, bei welcher Sonneneinstrahlung der eigene Geier noch sinnvoll flugfähig ist.

Daher grübele ich noch über die Voreinstellung MPP Volt ?
Langen denn nicht als Grenzwerte der Regelung ein paar Eckparameter ?
Zum Bleistift mit dem Sunrise SiSkin 11A Regler:
der setzt bei um die 5 / 5.2V definitiv aus, BEC Spannung vernippelt hinten raus, die D47 laufen in irgendeine Position.
Also setzte ich mir in der Regelung eine "Abbruchspannung von ca. 5.4V" (habe die Zeilen grad nicht zuhand, bin auf Arbeit ..:), hier also Motor hart aus.
Alles für RC-Steuerung hergeben.

Die andere Richtung ? Naja, solange Knüppel auf Vollgas steht, und die vormals gemessene Spannung niedriger ist als die aktuelle, mehr Gas auf Motor.
Die Frage nach Knüppelstellung erscheint MIR eigentlich fast philosofischa Natur, gibt wohl nur 0% und 100%, entweder Motor aus oder der Arduino muss es richten.
Fliegen mit 50% Gasknüppelstellung bei der Möglichkeit MEHR zu kriegen, na der Fall muss erstmal eintreten. :D

nachher gehts weita ,, muss schaffe.
 
Moin Rudi
Ich denke Du hast da nen kleinen Denkfehler.
Die MPP Spannung ist nahezu unabhängig von der Zellenqualität, ein bissl was von der Strippe in der Fläche.
Ich weiß nicht wieviele 12zeller ich eingemessen habe, bisher ist keiner nennenswert von der PiXDaumen Vorgabespannung 6,2-6,3Volt abgewichen, da waren welche mit uralt ResteC50 dabei, bis hin zu den neusten selektierten E60.
Irgendwas unter 6Volt, oder über 6,5Volt wird immer schlechter und fehlabgestimmt sein.

Die Mpp Spannung steigt etwas mit der Lichtstärke, und sinkt mit zunehmender Temperatur. Da es bei viel Licht eigentlich immer auch wärmer ist, gleicht sich das ein wenig wieder aus.
Die extremen Randbereicht die man für das Hausdach braucht, dürfen wir getrost ausblenden, erst bei ganz wenig Licht geht die MPP-Spannung in die Knie, aber da hast Du Dein Modell schon längst eingepackt.

Glaubs mir, stells auf 6,2-6,3Volt ein, unter mittleren Bedingungen, und dann geht das schon. besser ist natürlich den Punkt mit einem Wattmeter genauer rauszusuchen.


Ich hatte mal diese Grafik hier im Forum gepostet, die Excel dazu hängt da auch irgendwo rum, ich hatte da ein typischen Kupferdraht um die 1mm gerechnet.
In der unteren Grafik ist um die unrealen Bedingungen an den Ränder bereinigt. Man könnte noch rechts und links den Bereich unter 400W/m², darunter fliegt ja kaum wer, und über 800W/m² hat man eh keine Probleme ;)
Man kann dann für seinen Fall eine fast horizontale Linie durch die Grafik ziehen.

MPP_wetter2.png


Hier mal die Kurve von meiner Bastel-Testfläche durchgefahren, rangezoomt auf den Spannungsbereich, da tut sich nicht viel an Verlusten wenn die Spannung nicht sooo exakt passt.
Die orangenen sind gut in der Sonne vorgewärmt, und dann volle Pulle, darum sinkt die Spannung, im Flug würde es abkühlen, und wieder nach rechts wandern.
Ich hatte letztes Jahr zig mal nach dem Flug gemessen, unter Sonne waren die Zellen immer ca. 10-15° über der Lufttemperatur, nach dem landen stiegt die Temp dann im Sekundentakt.
streupunkte1.png
 
Das kleine Pyranometer

Das kleine Pyranometer

Moin

Das kleine Pyranometer

An sich braucht heute niemand mehr ein Pyranometer, da die Dinger zunehmend überall auf den Wetterstationen verteilt sind, und die Daten jederzeit online per Smartphone abrufbar sind :)

Dennoch, ein bissl basteln muss sein, die Saison steht vor der Tür, über den tsl230 Sensor hatten wir ja schon letztes Jahr geschrieben, ein tsl hängt nun schon seit über einem halbem Jahr draussen am Haus, wird parallel zum Pyranometer der regionalen Wetterstation mitgeloggt. Ergebnis: das Teil funktioniert hervorragend :cool::cool:
(Was man von meisten anderen Sensoren nicht behaupten kann, meist entpuppten sich die vielen tolle Bauanleitung im Netz letztlich dann doch nur als ein gepimptes Lux_Meter (vermutlich nur um mal wieder mit den 3D Drucker zu posen :D)

Also ab dafür, lokale Messtation steht, nun was Mobiles fürs Flugfeld, und für die Bastler:
Wir bauen eine Pyranometermaus für 10€:
tsl230_.JPG
Ein At85 als Protokollübersetzer und ein TSL230 auf einem DIP16Sockel. Ich denke was mit Quarz wird besser sein, da der TSL seine Daten als Frequenz ausgibt.
Ein ESP8826 und die passende Phone-App wäre evtl eine Idee ?

Display (TFT & Co) direkt am Sensor funzt ja kaum, weil man es in der Sonne nicht vernünftig lesen kann, das alte Nokia5110 geht so halbwegs, und natürlich diese White-screen Teile.

Abrufen des Sensors ist extrem einfach, er liefert eine Frequenz.
Zum Diagramm links, beide Achsen sind logarithmisch, nicht der Sensor, der ist linear:
TSL230.jpg
 
Moin
Geistesblitz
Die TINY-MPP-PROGBOX hat ab dieser Saison ja eh jeder Solarflieger im Koffer dabei ;):rolleyes:

Also, PROGBOX um den TSL230 als Pyranometer-Mäus-chen erweitert, ist nur ein DIP-8Chip mit Servokabel drann, sonst keinerlei Bauteile :)


Bild ist jetzt nicht so toll geworden, da ich per Halogenlampe nebenher Werte produzieren musste.
100_3025.JPG
 
Hallo Holger

Ich habe heute mein Arduino pro micro zum rennen gebracht.

Leider stimmt wohl etwas noch nicht ganz oder ich mache etwas falsch.

Du hast mir gesagt, ich soll mittels Multimeter die Spannung messen und den Gasknüppel dann bei ca. 7.2-7.3 als Vollgas proggen.

Nun mein Problem:

Ich kann den Motor ohne Probleme steuern wenig Drehzahl bzw etwas mehr Drehzahl.

Allerdings verändert sich die Spannung nicht. Ich habe immer ca. 8.5V Spannung egal wo der Knüppel steht. Wenn der Motor aus ist natürlich noch etwas mehr.
Nun was mache ich falsch ? Die Spannung messe ich am Regler.
 
Hallo Robin
Die alte Version habe ich dir auf dei PM gelegt.
Ist es die 8MHz Boardversion ?
Lillypadarduino USB in der IDE ?
Der Anschlussplan:

mppc_t6.jpg



Ansonsten probier mal diese abgespeckte

Code:
uint16_t RC, MPP, SVolt,  ICR1a;

void setup() { 
      DDRB   |= 0b01010100;     // ESC-PPM-OUT OC1B 32u4 = PB6(D10)
      PORTD  |= 0b00010000;     // READ-RC-IN  ICP1 32u4 = PD4(D4) 
      TCCR1A  = 0b00100011;     // Fast PWM,   OC1A as Top, OC1B is PWM
      TCCR1B  = 0b01011010;     // ICP-rising, Prescale 1/8
      TIMSK1  = 0b00100000;     // ICP-ISR activ
      OCR1A   = 2000;           // PPM-OUT Timer Top for 2mS 500Hz
      OCR1B   = 1100;           // Start PPM ESC      
      sei();    
      analogReference(INTERNAL);
      delay(2500);              //wait init ESC
}
 
void loop(){
while ( TIFR1   & (1<<TOV1))          // OVF -Flag abfragen, taucht alle 2mS auf.
{       TIFR1  |= (1<<TOV1);          // wenn gesetzt dann OVF1 Flag löschen.      
      MPP     = 2200- RC;            // RC wird in die ADC range gewandelt                       
      SVolt   = 0;                  // SVolt zurücksetzen
      for(int i=1; i<=8; i++)       // Schleife zum ADC runden
{     SVolt  += analogRead(A0);     // alle ADC Werte addieren  
}     SVolt  /= 8;      // teilen und zugleich Kalibrieren

  if (SVolt > MPP) {if (OCR1B < 1900) {OCR1B += +1 + ((SVolt - MPP) / 5); }} //Voltage to high -inc PWM
  else             {if (OCR1B > 1100) {OCR1B += -1 - ((MPP - SVolt) / 5); }} //Voltage to high -dec PWM
}}}


ISR (TIMER1_CAPT_vect) {          // RC READ ISR  
if(TCCR1B   &  (1<<ICES1))        // we have rising edge -
{   TCCR1B &= ~(1<<ICES1);        // switch ICP to falling edge                                             
    ICR1a   =  ICR1;              // store ICP1 IN ICP1a
} else                            // we have falling edge
{   TCCR1B |=  (1<<ICES1);        // switch ICP @ rising edge                                               
 if (ICR1   <  ICR1a)             // if Overflow ? 
       {RC  =  ICR1+2000-ICR1a;}  // Yes > Calc RC with OVF
 else  {RC  =  ICR1     -ICR1a;}  // No  > Calc RC without OVF
}}
 
Hallo Holger

Ja ist die 8MHz Version.
Angeschlossen habe ich alles richtig. IDE ist auch richtig.

Mit dem alten Code funktioniert auch alles soweit. Nur eben kann ich die Spannung nicht über mein Sender steuern.

Ich kann Gas geben der Motor dreht sich, aber die Spannung sinkt nie unter 8.2-8.4V egal wo der Gasknüppel steht.


Muss ich da am Code etwas auf 14 Zellen anpassen? Oder an was könnte das liegen?
 
Nein angepasst werden muss da eigentlich nichts.

Messe bitte mal die Spannung auf dem Pin A1 die sollte um die 2Volt sein, bei 14Zellen, bzw 8-9V am Eingang.

Passt der Propeller? der sollte bei 7,5Volt bei etwa 6A liegen (mit 2s mal testen).
 
Moin Robin
Schon mal weiter getestet ?

Ich kann Gas geben der Motor dreht sich, aber die Spannung sinkt nie unter 8.2-8.4V egal wo der Gasknüppel steht.
Nach einigem Überlegen deutet das Fehlerbild auf fehlendem Propeller hin.
Der Propeller stellt am Motor quasi die Last dar.
Ohne Propeller kann man den Motor schalten bzw ein bissl regeln, aber die Spannung sinkt bei laufendem Motor nur minimal (Leerlaufstrom vom Motor).
 
Hallo Holger

Konnte gestern noch einige Testläufe durchführen. Läuft soweit alles wie es soll. Spannung lässt sich nun sehr gut regeln. Auch hat der Motor nun eine ansprechende Kraft entwickelt MIT PROPELLER natürlich.
Im Nachhinein ja logisch :)

Und mit der "alten" Software.

Überigends Spannung sind 2.4V am A1

Vielen Dank
 

Ondas

User
Ich bin nur stiller (aber interessierter) Mitleser, aber ich wollte mal vielen Dank für die interessante Zusammenfassung und die viele Arbeit, die den Usern zugute kommt, sagen.
Ralf
 
  • Like
Reaktionen: GC
Hallo Holger,

Lassen wir unsere ATtiny / FrSky Diskussion von https://www.rc-network.de/threads/solarflieger.517258/page-96 hier weiterführen.

Mit Invertiert meine ich: 0=1, und 1=0. Deswegen die extra HW. Mit one-wire UART und pininvert ist die 412 nahezu ideal.

Das im SBUS thread ist interessant. Ich glaube, es sollte nicht all zu schwierig sein damit Frsky telemetrie zum laufen zu bringen.
Dokumentation habe ich hier her: https://www.ordinoscope.net/static/arduino-frskysp/docs/html/

Ich muss meine Umgebung für die 412 noch anpassen. Normalerweise programmiere ich im Arduino IDe, habe aber rezent Sloeber entdeckt, das ist doch etwas flexibeler, das moechte ich mal versuchen.
C experte bin ich leider nicht, wenn ich vor 20 Jahre meine eigene mini-Quadkopter gebastelt habe (die gab es damals noch kaum), habe ich das alles in Basic (Bascom) ganz nah am HW gemacht. Später habe ich gewechselt zu Arduino fuer einfachere Projekte. Was ich da ziemlich schwierig fand ist zu verstehen wie die Libraries die Begrenzte Resources (timers / ADC etc) benutzen. Wenn Timing wichtig ist wirst da schwierig, da arbeite ich lieber direct mit dem Registers.

Eile hat das alles nicht, ende dieser Monat habe ich erst mehr zeit.

Zum HW schicke ich dich eine PM.

Grusse,
Merijn
 
Hallo Merijn
Ich verstehe die Doku zu dem Frsky nicht ganz

Bei Hott z.B.
Der Empfänger sendet Bytes zum Telemetriemodul über One-Wire, die Bytes bedeuten bestimmte Sensorarten abzufragen.
Kommt ein bestimmtes Byte, dann wartet man 5mS - und sendet dann die Telemteriebytes in 1mS Abstand. Das sind (meist) 45Bytes, die dann die Werte beinhalten.

Magst du mit das mal so ähnlich erklären, ich verstehe den Ablauf dort nicht.

Ich habe die Teilcodes für Solar zumeist fertig, ich muss die alle mal auf dem Testboard nochmal checken,, dann stell ich sie nach und nach rein.
Servokanal auslesen passiert kmpl. im Hintergrund, fast magisch :-)
Servoausgabe mache ich direkt mit einem Timer, 500Hz Signal für BLHeliregler.
ADC ist spannend, die neuen Attinys haben einen Accumulator, dort kann man bis zu 64(1024) Runden den ADC im Hintergrund laufen lassen, er summiert die Werte zum runden, und meldet sich per ISR wenn er damit fertig ist.

Für die Arduino gibt es den Spence-Code, aber ich nutze kaum die Arduino-Befehle, weile es dann meist blockt.
Zum Upload ist auf der Spence-Seite der UBDI Adapter Code für Nano/Uno, der funtioniert bestens. Es geht auch mit normalen One-Wire Adaptern, bei mir läuft das aber recht instabil, so das ich dann doch lieber einen Nano für den UDPI Adapter geopfert habe.

Wir müssten uns als erstes auf eine CPD Frequenz einigen, die neuen Attinys können bis 20MHz ohne Quarz. Laut Datenblatt für 3,3Volt soll man bei 10Mhz Schluss machen, aber sei rennen auch bei unter 3Volt bei vielen bis 20MHz stabil.
Für die Telemetrieanschlüsse sind 3,3Volt sicherer, einige Empfänger könnten nciht 5V-Tolerant sein, wenn man das Projekt weiter führt.
Die 3,3V zapfe ich mir immer am Regler am Elko für den Regler-CPU ab ;-)
 
Der (noch) aktuelle TinyMPPc auf Basis vom Attiny44 inkl. Hott Telemetrie.

Schlecht dokumentiert, wenn Fragen, dann fragen.
Grob die Loop taktet immer im 2mS Takt, getaktet durch den Timer der auch die PWM im 2mS Takt ausgibt, ist dadurch synchron.

Telemtrie, wenn ein Byte zu senden ist, dann sendet er es in der ersten mS taktweise im BitBang raus.
USI meldet ein empfangenes Byte, da USI invers empfängt (Bit 0 ist Bit7) frage ich der Einfachheithalber auch invers ab, und muss es nicht verdrehen. (etwas verwirrend).
Die Steuerung an sich; bei Regelgröße ist abhängig von der Spannungsaweichung (große Abweichung gibt große Regelschritte).
 

Anhänge

  • TinyMPP.zip.txt
    899,6 KB · Aufrufe: 72
Danke, das werde ich mich dieses Wochenende mal angucken. Das MPP Teil ist schon ziemlich klar. Telemetrie muss ich mal besser lesen.

Hast du auch schon etwas für die 412? Da gibt es mehr Freiheit mit Timer.

Gruesse,

Merijn
 
Hallo Merijn
Ich setztmich die Tage bei, das At412er Zeug rauszukramen.

Aber eine Frage ich verstehe das FrSky Protokoll nicht ganz

Der Empfänger sendet zum Senser (unser MPP)
- 0x7E
- Eine SensorID (Ein Byte? welches?)

Dann antwortet der Sensor (MPP) ?
Wartezeit bis zum ersten Byte ?
Abstände der Bytes ?
Welchen Sensor sollte man nehmen, Sensorbeschreibung ?


edit ....
Hier habe ich was gefunden:
file.php


Das sind dann 8Bytes - Antwortzeit ca. 1,4mS - ist das richtig (weil solange steht der MPP, bzw. stockt, je nachdem wie wir das bauen, das müssten wir ja mit einplanen)

Edit2
Wir müssten wie in dem Fall auf dem Bild ja eigentlich nur abfragen,ob1B gesendet wurde (7E brauchen wir ja nicht, oder gibt es eine anderen Fall wo 1B mitverendet wird ?) Dann ca. 0,5mS warten und die 8Byte rausjagen.

Diese 11mS verstehe ich nicht ganz, ist der das Abstand der Abfragen vom Empfänger ?

Wieviele Sensor ID braucht man, oder reicht eines ? (bei nur 8Byte, bei Hott sind es 45Byte)

Edit3
Ein Sensor - ein Wert ?
Wir bräuchten:

Spannung ist
Spannung soll (MPP Gaskanal)
PPM_out

0xA1// Physical ID 1 - FLVSS Lipo sensor (can be sent with one or two cell voltages)
0x22// Physical ID 2 - FAS-40S current sensor
 
Zuletzt bearbeitet:
Der erste Teilcode für den neuen MPP für den Attiny Series 0/1/2

Geproggt wurde in der Arduino IDE mit Spence-Code Megatiny-Core https://github.com/SpenceKonde/megaTinyCore
Flashadapter ist ein Arduino Nano, geflasht zum Jtag2UPDI (auch im Spence-Code).




RC-Signal auslesen aus dem Empfänger

Dank Eventmanager und Input Capture Pulse-Width Measurement Mode (Datenblatt 21.3.3.1.5) passiert das KOMPLETT im Hintergrund, fast schon schwarze-Magie ;) Es ist kein Code in der Loop nötig, und kein Interrupt poppt auf 😍
Als Ressource wird dafür der TCB-Timer geopfert.

Das Ergebniss im Test Serial aus der Loop, wird ja nachher nicht mehr gebraucht, es ist natürlich abhängig vom Prozessortakt, um für Servomitte 1500µS zu erhalten müssen wir es noch teilen. (TCB0.CCMP /8 für 16MHz):
8MHz 6000 /4=1500
10MHz 7500 /5=1500
16MHz 12000 /8=1500
20MHz 15000 /10=1500


Code:
void setup() {
  PORTA.DIRCLR    |= PIN3_bm;                               // PA3 ist INPUT
  PORTA.PIN3CTRL  |= PORT_PULLUPEN_bm;                      // PA3 Pullup    
  EVSYS.ASYNCUSER0|= EVSYS_ASYNCUSER0_ASYNCCH0_gc;          // USer 0 ist TCB-Event 
  EVSYS.ASYNCCH0  |= EVSYS_ASYNCCH0_PORTA_PIN3_gc;          // Event Pin A3 ASYNCCH0
  TCB0.CTRLA      |= TCB_CLKSEL_CLKDIV2_gc |TCB_ENABLE_bm ; // CLK_PER divider
  TCB0.CTRLB      |= TCB_CNTMODE_FRQPW_gc;                  // Capture Mode  
  TCB0.EVCTRL     |= TCB_CAPTEI_bm;                         // Enable Event Input and Event Edge
  TCB0.INTCTRL    |= TCB_CAPT_bm;                           // Enable Capture interrupt

  sei(); 
  Serial.begin(57600);
}

void loop() {
Serial.println( TCB0.CCMP /8 );delay(50); //Check
}
 
PPM Ausgabe auf den drei möglichen PWM-Pins vom At412
Ressource hierfür ist der TCA Timer

Auch das passiert im Hintergrund, der Code in der Loop ist nur ein bissl Pulse-Längen-Bewegung.

TCA0.SINGLE.PER = 2000;
Ist in µS - 2000wäre dann für PPM BLHeli 500Hz, oder 20000 für 20mS/50Hz Servos

takeOverTCA0();
Ist Arduino Spence-Code bedingt, für C wäre das nicht nötig. (Schießt das weg was die Arduino-IDE hinzuschwurbelt, die Geister die ich rief ;-) ).
Das wäre jetzt die Entscheidung ob AVR-GCC oder Arduino, beides kann man in der Arduino-IDE schreiben.

Code:
///                __  __
///          VCC -|o \/  |- GND
///          PA6 -|ATTINY|- PA3
///          PA7 -| 412  |- PA0 UPDI
///          PA1 -|______|- PA2

void setup() {
  PORTA.DIRSET      |= PIN1_bm|PIN2_bm|PIN3_bm;
  takeOverTCA0();  // This replaces disabling and resettng the timer, required previously.
  TCA0.SINGLE.CTRLA |= TCA_SINGLE_CLKSEL_DIV16_gc | TCA_SINGLE_ENABLE_bm;
  TCA0.SINGLE.CTRLB |= TCA_SINGLE_CMP2EN_bm|TCA_SINGLE_CMP1EN_bm|TCA_SINGLE_CMP0EN_bm|TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
  TCA0.SINGLE.PER    = 2000;  // 2000=2mS für BLHeli oder 20000 für 20mS Servosignal
}

void loop() {
  TCA0.SINGLE.CMP0 = 1000;  // PA3(D4) duty cycle
  TCA0.SINGLE.CMP1 = 1100;  // PA1(D2) duty cycle
  TCA0.SINGLE.CMP2 = 1200;  // PA2(D3) duty cycle
  delay(1000);
  TCA0.SINGLE.CMP0 = 1600;  // PA3(D4) duty cycle
  TCA0.SINGLE.CMP1 = 1800;  // PA1(D2) duty cycle
  TCA0.SINGLE.CMP2 = 1900;  // PA2(D3) duty cycle
  delay(1000);
  }
 
Zuletzt bearbeitet:
RC einlesen 50Hz Signal und direkt als 500Hz 2mS wieder ausgeben.
In C - sind das nur ~200Byte, und nix unlogisches ;-)


Code:
///                __  __
///          VCC -|o \/  |- GND
///          PA6 -|ATTINY|- PA3
///          PA7 -| 412  |- PA0 UPDI
///          PA1 -|______|- PA2


#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void){ 
  _PROTECTED_WRITE(CLKCTRL_MCLKCTRLB, 0x00); //CPU prescale 0 für 16MHz 
  
  //PPM OUT
  PORTA.DIRSET      = PIN1_bm; 
  TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV16_gc | TCA_SINGLE_ENABLE_bm;
  TCA0.SINGLE.CTRLB = TCA_SINGLE_CMP1EN_bm|TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
  TCA0.SINGLE.PER    = 2000;  // 2000=2mS für BLHeli oder 20000 für 20mS Servosignal

  //RC IN
  PORTA.DIRCLR    = PIN3_bm;                               // PA3 ist INPUT
  PORTA.PIN3CTRL  = PORT_PULLUPEN_bm;                      // PA3 Pullup     
  EVSYS.ASYNCUSER0= EVSYS_ASYNCUSER0_ASYNCCH0_gc;          // USer 0 ist TCB-Event  
  EVSYS.ASYNCCH0  = EVSYS_ASYNCCH0_PORTA_PIN3_gc;          // Event Pin A3 ASYNCCH0
  TCB0.CTRLA      = TCB_CLKSEL_CLKDIV2_gc |TCB_ENABLE_bm ; // CLK_PER divider
  TCB0.CTRLB      = TCB_CNTMODE_FRQPW_gc;                  // Capture Mode   
  TCB0.EVCTRL     = TCB_CAPTEI_bm;                         // Enable Event Input and Event Edge
  TCB0.INTCTRL    = TCB_CAPT_bm;                           // Enable Capture interrupt

  sei();  

while (1){  
  TCA0.SINGLE.CMP1 = TCB0.CCMP /8;  // PA1(D2) duty cycle 
  _delay_ms(100);
}}
 
Ansicht hell / dunkel umschalten
Oben Unten