Hallo liebes Forum,
ich hoffe es kennt sich jemand ein bisschen mit der Programmierung eines
Mikrocontrollers aus. Ich habe bereits eine PWM erzeugen können.
Hier die Source-Datei:
Quellcode
1 | /* ***************************************************************/
|
2 | /* Programm: PWM auf AVR-Board mit ATMega8 */
|
3 | /* Name: Patrick Willenshofer */
|
4 | /* Datum: 18.12.2011 */
|
5 | /* ***************************************************************/
|
6 |
|
7 | #include <avr/io.h>
|
8 | int main (void)
|
9 | {
|
10 | DDRB = (1 << PB1 );
|
11 | // Freischalten des Ausganges PB1(OC1A) am PortB
|
12 |
|
13 | TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0);
|
14 | //Um die PWM starten zu können müssen Parameter für das Controll Register A (TCCR1A)
|
15 | //laut Tabellen gesetzt werden hier handelt es sich um eine 8-Bit, invertierende PWM
|
16 |
|
17 | TCCR1B = (1<<CS12);
|
18 | //Das Controllregister B (TCCR1B) ist für den Takt zuständig und kann ebenfalls
|
19 | //durch Parameter aus den Tabellen bestimmt bzw. eingestellt werden.
|
20 |
|
21 | OCR1A = 200;
|
22 | // Das Output Compare Register (OCR1A) gibt den Vergleichswert an.
|
23 | }
|
Achja. mein Mikrocontroller ist ein ATMEL ATMega8.
Nun stehe ich vor folgender Aufgabe: Ich will an ADC0 und ADC1 (Port C)
Potentiometer ranhängen, um mit ADC0 die Frequenz - und mit ADC1 die
Pulsweite - modulieren.
Ich habe mich schon tief in das Analog-Digital-Wandler-Thema eingelesen.
Ich kann auch schon ziemlich gut die Zusammenhänge verstehen.
Nur: Wie müsste der Code im endeffekt aussehen? Kann mir jemand
Bruchteile posten, würde gern von selber draufkommen :)
Ich tu mir nur schwer, zu verstehen, wie ich das modulieren kann. Ich
hab schon viel gehört, PWM ist sehr einfach und kann jeder. Nun, stimm
ich zu, aber ich denk grad viel zu kompliziert..
Mein Ansatz ist ja folgender:
*) Mit ADC0 möchte ich die Frequenz verändern. Die Werte, die der ADC
als Ergebnis bekommt, werden ins ADCL und ins ADCH geschrieben.
Ich habe eine Auflösung von 10Bit, also würd es so aussehen:
x = ACDL; // die Variable x bekommt die 8Bit vom ADCL zugewiesen - mit
uint16_t für x
x += ACDH; // der Inhalt (2Bits) werden zur Variable x addiert.
die Variable x wird danach dem im ADC SRA (ADC Status Register A) den
Bits 0,1,2 zuweisen. Die sind ja schließlich für den Takt zuständig?
Also hier ist im MUX der ADC0 ausgewählt. Nachdem er hier gemessen hat,
würde er im nächsten Schritt zum ADC1 wechseln und dort wieder messen
und auswerten.
Immer wenn ich mich weiter darin vertiefen will, verlier ich den
Überbrlick. Ich hoff, mir kann jemand weiterhelfen.
Sind meine Ansätze richtig? Ich hoffe es jedenfalls. :)
Vielen Dank schon einmal!