main.c
1 | // benötigte Headerdateien
| 2 | #include <avr/io.h>
| 3 | #include <stdio.h>
| 4 | #include <util/delay.h>
| 5 | #include "lcd.h"
| 6 |
| 7 | /*
| 8 | LCD ansteuerungscode weggelassen, da irrelevant
| 9 | */
| 10 |
| 11 | const uint16_t pwmtable[64] = {
| 12 | 0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5,
| 13 | 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17,
| 14 | 19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55,
| 15 | 61, 68, 76, 85, 94, 105, 117, 131, 146, 162,
| 16 | 181, 202, 225, 250, 279, 311, 346, 386, 430,
| 17 | 479, 534, 595, 663, 739, 824, 918, 1023};
| 18 |
| 19 |
| 20 | // Funktion für die PWM initialisierung
| 21 | void pwm_init(void)
| 22 | {
| 23 | DDRD = (1 << PD5); // PWM pin als ausgang
| 24 |
| 25 | TCCR1A = (1 << COM1A1) | (1 << COM1A0) | (1 << WGM10) | (1 << WGM11); // 10-bit Fast PWM mode
| 26 | TCCR1B = (1 << WGM12) | (1 << CS10) | (1 << CS10); // Prescaler: F_CPU/64
| 27 | OCR1A = 0x0000;
| 28 | }
| 29 |
| 30 | // Funktion zum auslesen des ADCs
| 31 | uint16_t adc_read(uint8_t mux)
| 32 | {
| 33 | uint8_t i;
| 34 | uint16_t result;
| 35 |
| 36 | ADMUX = mux; // Kanal wählen
| 37 | ADMUX |= (1<<ADLAR);
| 38 | ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
| 39 |
| 40 | // Dummy readout
| 41 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
| 42 | while(ADCSRA & (1<<ADSC)); // auf Abschuss der Wandlung warten
| 43 | result = ADCH; // ADCW lesen
| 44 |
| 45 | // Eigentliche Messung - Mittelwert aus 5 aufeinanderfolgenden Wandlungen
| 46 | result = 0;
| 47 | for(i=0; i<5; i++)
| 48 | {
| 49 | ADCSRA |= (1<<ADSC); // eine Wandlung
| 50 | while(ADCSRA & (1<<ADSC)); // auf Abschuss der Wandlung warten
| 51 | result += ADCH; // Wandlungsergebnisse aufaddieren
| 52 | }
| 53 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren
| 54 |
| 55 | result /= 4; // Summe durch vier teilen = arithm. Mittelwert
| 56 |
| 57 | return result;
| 58 | }
| 59 |
| 60 |
| 61 | // Hauptfunktion
| 62 | int main(void)
| 63 | {
| 64 | // initialisierungen
| 65 | lcd_init();
| 66 | lcd_string("Initializing...");
| 67 | pwm_init();
| 68 | _delay_ms(500);
| 69 |
| 70 | char buffer[20];
| 71 | uint16_t ldr, pwm;
| 72 |
| 73 | // endlose Hauptschleife
| 74 | while(1)
| 75 | {
| 76 | ldr = adc_read(PA7); // adc auslesen
| 77 | pwm = (ldr>>2); // 8-bit => 6-bit
| 78 | OCR1A = pwmtable[64-pwm]; // pwm Wert setzen
| 79 | sprintf(buffer, "LDR: %3d PWM: %2d", ldr, pwm); // Werte anzeigen
| 80 | lcd_clear();
| 81 | lcd_string(buffer);
| 82 | sprintf(buffer, "PWMTABLE: %4d", pwmtable[64-pwm]);
| 83 | set_cursor(0, 2);
| 84 | lcd_string(buffer);
| 85 | _delay_ms(500);
| 86 | };
| 87 |
| 88 | return 0;
| 89 | }
|
|