Soo ich habe jetzt den Code geschrieben und hoffe, dass es so funktionieren könnte.
Da ich ein Panel zur Sonne ausrichten lassen will (programmtechnisch), hoffe ich das meine Idee auch so funktionieren kann.
Da ich auch noch nicht so sehr mit C++ vertraut bin, Bitte ich euch mir zu sagen, welche Variante besser wäre, also nicht so rechenlastig für den µC.Code:#define F_CPU 8000000UL #include <avr/io.h> #include <stdint.h> #include <util/delay.h> #include <stdio.h> #include "ADC.h" DDRD = (1<<PIND5); //PORTD pin 5 auf ausgang uint16_t Servo_soll = 512, Servo_ist; ADC_Init(); //ADC initialisieren TCCR1A = (1<<COM1A1) | (1<<WGM11); //clear OC1A on compare match, set at bottom (non-inverting) TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS11); //WGM12,WGM13,WGM11 -> Mode14 -> Fast PWM, ICRn, set OCR1A at Bottom | prescaler = 8 ICR1 = 19999; // ICR1 = 19999 als TOP-Wert, hier werden die 20ms gebildet (8MHz / 8 * (1 + 19999)) = 50Hz OCR1A = 1499; // OCR1A = 1499, Servomittelstellung, (8MHz / 8 * (1 + 1499)) = 666,6Hz = 1,5ms _delay_ms(2000); // kurz warten bis der Servo sich ausgerichtet hat
Diese mit if?:
Oder Diese mit while?:Code:while(1) { //########################################### Nachführung des Panels ####################################### Servo_ist = ADC_Read(1); //ADC kanal 1 auslesen und in die variable adcwert_1_LDRs speichern if (Servo_ist != Servo_soll) //Wenn der ADC-Wert der LDRs nicht mit dem Servo_soll Wert von 512 überein stimmt, dann... { if (Servo_ist < Servo_soll && OCR1A > 600) //Wenn der ADC-Wert kleiner ist als 512 und 0,6ms noch nicht erreicht sind... { OCR1A = OCR1A--; //verringere OCR1A um 1 } if (Servo_ist > Servo_soll && OCR1A < 2600) //Wenn der ADC-Wert größer ist als 512 und 2,6ms noch nicht erreicht sind... { OCR1A = OCR1A++; //erhöhe OCR1A um 1 } } }
GrußCode:while(1) { //########################################### Nachführung des Panels ####################################### Servo_ist = ADC_Read(1); //ADC kanal 1 auslesen und in die variable adcwert_1_LDRs speichern if (Servo_ist != Servo_soll) //Wenn der ADC-Wert der LDRs nicht mit dem Servo_soll Wert von 512 überein stimmt, dann... { if (Servo_ist < 500 || Servo_ist > 524) //Tolleranzbereich, sodass der Servo nich bei jeder kleinen Änderung dreht { while(Servo_ist < Servo_soll && OCR1A > 600) //Solange der ADC-Wert kleiner ist als 512 und 0,6ms noch nicht erreicht sind... { OCR1A = OCR1A--; //verringere OCR1A um 1 } while(Servo_ist > Servo_soll && OCR1A < 2600) //Solange der ADC-Wert größer ist als 512 und 2,6ms noch nicht erreicht sind... { OCR1A = OCR1A++; //erhöhe OCR1A um 1 } } } }
Technik_Amateur







Zitieren

Lesezeichen