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.
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
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.
Diese mit if?:
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
}
}
}
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 < 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
}
}
}
}
Gruß
Technik_Amateur
Lesezeichen