Hallo,
ich bin sowohl µC- als auch im speziellen AVR32-Einsteiger und stehe vor
der Problematik, in variablen Zeitabständen (0-300sek) ein Ventil zu
öffnen (0-2000ms). Als Notvariante habe ich zumindest die Öffnungszeit
per PWM einmal realisieren können. Allerdings kann ich bei einem
PWM-Signal nur einen Parameter im laufenden Betrieb ändern (entweder
Pulsbreite oder Periode). Daher dachte ich an die Verwendung einer
Funktion, die nur die Parameter Öffnungszeit und Periode in
Zeiteinheiten übergeben bekommt.
Parallel dazu läuft im Hauptprogramm eine ganze Menge anderer Babel ab,
weshalb sichergestellt sein müsste, dass die Ventilabsteuerung nabhängig
davon läuft (also mit Interrupts, wie ich das verstanden habe?). -->
Timer/Counter nutzen
Bisher habe ich mir das Framework zum UC3A angesehen und für GPIO, ADC
und PWM die vorgefertigten Methoden zurückverfolgt und sozusagen alles
im Grundformat (ohne extra eingebundene Header-Dateien) geschrieben. Das
hat bis dahin geklappt (Dank dem UC3-Manual und Zippi aus dem Forum).
Mit den Header-Files zum Counter bin ich allerdings völlig überfordert,
weil die in meinen Augen ziemlich aufgeblasen sind und ich bisher noch
nicht mit Interrupts noch nicht gearbeitet habe.
Hat jemand schonmal ähnliches gemacht und dazu die Frameworkdateien
entrümpelt oder selbst Methoden geschrieben?
Ich würde am liebsten alles im Stile von meiner PWM-Init machen, ohne
extra erschaffene Variablen, Structs und ähnlichem.
1 | void PWM(int channel)
|
2 | {
|
3 | AVR32_PM.pbamask = AVR32_PM.pbamask | (1 << 12); //Enable PWM clock
|
4 | AVR32_PWM.mr = (1 << 0) //DIVA set, clock selected by PREA
|
5 | | (0x0 << 8); //PREA set, divider = 1
|
6 | AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr | (0x0 << 0); //Pre-scaler 1
|
7 | AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr &(~(1 << 8)); //period left-aligned (calg)
|
8 | AVR32_PWM.channel[channel].cprd = 10; //period
|
9 | AVR32_PWM.channel[channel].cdty = 5; //pulsewidth (duty cycle)
|
10 | AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr | (1 << 9); //Polarity of output (cpol)
|
11 | AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr &(~(1 << 10)); //cupd will update duty cycle (cdty)
|
12 | AVR32_PWM.ena = (1 << channel); //PWM for channel x enabled
|
13 | AVR32_GPIO.port[1].gperc = (1 << (channel + 19)); // Use PB19+x as function, disable setting as a periphal pin
|
14 | AVR32_GPIO.port[1].pmr0c = (1 << (channel + 19)); //Function A (PWM) selected through setting
|
15 | AVR32_GPIO.port[1].pmr1c = (1 << (channel + 19)); //(pmr0c, pmr1c) = 00
|
16 |
|
17 | }
|
Wer kann helfen, evtl. Tipps zur Herangehensweise geben?