Hej Leute
Ich bin neu hier und habe ein kleines Problem woran ich schon seit ne ewigkeit arbeite.
Mein Vorhaben: ich bin leidenschaftlicher Modellbauer (Modellflug) und baue ultra kleine leichte micro Modelle
wie z.b. Microflieger oder microcopter und benötige für die Micro Bürstenmotoren micro
Regler die sehr klein und leicht sind.
Da ich im Netzt kaum was gefunden habe und wenn dann fast unbezahlbar, hab ich mich dafür entschieden
meinen eigenen Regler zu bauen.
Meine Hardware/Software:
Atmega8 mit 4MHz Extern.
Oszilloskop
Multimeter...
Diverse Transistoren und Mosfets.
Micro Bürstenmotoren (max 1A), LEDs...
RC Empfänger / Servotester.
AtmelStudio6.
Extreme Burner AVR
Programmiersprache C++
Was ich erreichen möchte ist ein PWM Signal was aus einem RC Epfänger / Servotester (50Hz) kommt,
an einem Eingang vom Atmega8 anzuschließen und an einem Ausgang ein PWM Signal mit höherer Frequenz (KHz) zu erzeugen.
Mit diesen Signal möchte ich ein Mosfet ansteuern der wiederrum einen kleinen Bürstenmotor betreibt.
Die Drehzahl sollte natürlich über das PWM Signal gesteuert werden können.
Z.B. Gasknüppel 0= Motor Aus, Gasknüppel voll = Motor maximale Drehzahl und natürlich alles was da ziwchen liegt.
Im Prinziep einfach die Drehzal des Micro Bürstmotors Steuern.
Hier ist mein Code Ansatz womit ich zwar die Drehzahl steuern kann, aber absolut ungenau und primitiv.
Ich bekomme es nicht hin ein genaues PWM Signal zu erzeugen der über das PWM Signal am Eingang gesteuert wird.
Es gibt sicherlich eine elegantere Lösung. Bin schon am verzewifeln.
Über eure Hilfe würde ich mich sehr freuen.
LG
Digit-22
Ich bin neu hier und habe ein kleines Problem woran ich schon seit ne ewigkeit arbeite.
Mein Vorhaben: ich bin leidenschaftlicher Modellbauer (Modellflug) und baue ultra kleine leichte micro Modelle
wie z.b. Microflieger oder microcopter und benötige für die Micro Bürstenmotoren micro
Regler die sehr klein und leicht sind.
Da ich im Netzt kaum was gefunden habe und wenn dann fast unbezahlbar, hab ich mich dafür entschieden
meinen eigenen Regler zu bauen.
Meine Hardware/Software:
Atmega8 mit 4MHz Extern.
Oszilloskop
Multimeter...
Diverse Transistoren und Mosfets.
Micro Bürstenmotoren (max 1A), LEDs...
RC Empfänger / Servotester.
AtmelStudio6.
Extreme Burner AVR
Programmiersprache C++
Was ich erreichen möchte ist ein PWM Signal was aus einem RC Epfänger / Servotester (50Hz) kommt,
an einem Eingang vom Atmega8 anzuschließen und an einem Ausgang ein PWM Signal mit höherer Frequenz (KHz) zu erzeugen.
Mit diesen Signal möchte ich ein Mosfet ansteuern der wiederrum einen kleinen Bürstenmotor betreibt.
Die Drehzahl sollte natürlich über das PWM Signal gesteuert werden können.
Z.B. Gasknüppel 0= Motor Aus, Gasknüppel voll = Motor maximale Drehzahl und natürlich alles was da ziwchen liegt.
Im Prinziep einfach die Drehzal des Micro Bürstmotors Steuern.
Hier ist mein Code Ansatz womit ich zwar die Drehzahl steuern kann, aber absolut ungenau und primitiv.
Ich bekomme es nicht hin ein genaues PWM Signal zu erzeugen der über das PWM Signal am Eingang gesteuert wird.
Es gibt sicherlich eine elegantere Lösung. Bin schon am verzewifeln.
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 4000000UL
volatile int flanke=0;
volatile int aktuell_pwm_l=0;
volatile int aktuell_pwm_h=0;
ISR(TIMER1_CAPT_vect)
{
if (flanke==0)
{
TCNT1H = 0; //Timer auf null zurück
TCNT1L = 0;
TCCR1B&= ~(1<<ICES1); //ICP-Pin auf fallende Flanke einstellen
flanke=1;
}
else
{
flanke=0;
TCCR1B|=(1<<ICES1); //ICP auf steigende Flanke wieder aktivieren
aktuell_pwm_l=ICR1L; //Zählerstand speichern
aktuell_pwm_h=ICR1H; //zählerstand speichern
}
}
void init_prozedur(void)
{
TCCR1B |= (1<<ICNC1)|(1<<ICES1)|(1<<CS11) | (1<<CS10); //vorteiler 64, Mittelung ON, steigende flanke
TIMSK |= (1<<TICIE1);//INTERRUPT ON
sei();
}
int main (void)
{
init_prozedur();
DDRC=0xff;
DDRB=0b11110000;
while(1)
{
if (aktuell_pwm_l >= 50 && aktuell_pwm_l < 60)
{
PORTC^=(1<<PC1);
_delay_us(200);
}
if (aktuell_pwm_l >= 60 && aktuell_pwm_l < 62)
{
PORTC^=(1<<PC1);
_delay_us(150);
}
if (aktuell_pwm_l >= 62 && aktuell_pwm_l < 64)
{
PORTC^=(1<<PC1);
_delay_us(100);
}
if (aktuell_pwm_l >= 64 && aktuell_pwm_l < 66)
{
PORTC^=(1<<PC1);
_delay_us(100);
}
if (aktuell_pwm_l >= 66 && aktuell_pwm_l < 68)
{
PORTC^=(1<<PC1);
_delay_us(100);
}
if (aktuell_pwm_l >= 68 && aktuell_pwm_l < 70)
{
PORTC^=(1<<PC1);
_delay_us(150);
}
if (aktuell_pwm_l >= 70 && aktuell_pwm_l < 72)
{
PORTC^=(1<<PC1);
_delay_us(200);
}
if (aktuell_pwm_l >= 72 && aktuell_pwm_l < 74)
{
PORTC^=(1<<PC1);
_delay_us(250);
}
if (aktuell_pwm_l >= 74 && aktuell_pwm_l < 76)
{
PORTC^=(1<<PC1);
_delay_us(300);
}
if (aktuell_pwm_l >= 76 && aktuell_pwm_l < 78)
{
PORTC^=(1<<PC1);
_delay_us(350);
}
if (aktuell_pwm_l >= 78 && aktuell_pwm_l < 80)
{
PORTC^=(1<<PC1);
_delay_us(400);
}
if (aktuell_pwm_l >= 80 && aktuell_pwm_l < 82)
{
PORTC^=(1<<PC1);
_delay_us(450);
}
if (aktuell_pwm_l >= 82 && aktuell_pwm_l < 84)
{
PORTC^=(1<<PC1);
_delay_us(500);
}
if (aktuell_pwm_l >= 84 && aktuell_pwm_l < 86)
{
PORTC^=(1<<PC1);
_delay_us(550);
}
if (aktuell_pwm_l >= 86 && aktuell_pwm_l < 88)
{
PORTC^=(1<<PC1);
_delay_us(600);
}
if (aktuell_pwm_l >= 88 && aktuell_pwm_l < 90)
{
PORTC^=(1<<PC1);
_delay_us(650);
}
if (aktuell_pwm_l >= 90 && aktuell_pwm_l < 92)
{
PORTC^=(1<<PC1);
_delay_us(700);
}
if (aktuell_pwm_l >= 92 && aktuell_pwm_l < 94)
{
PORTC^=(1<<PC1);
_delay_us(750);
}
if (aktuell_pwm_l >= 94 && aktuell_pwm_l < 96)
{
PORTC^=(1<<PC1);
_delay_us(800);
}
if (aktuell_pwm_l >= 96 && aktuell_pwm_l < 98)
{
PORTC^=(1<<PC1);
_delay_us(850);
}
if (aktuell_pwm_l >= 98 && aktuell_pwm_l < 100)
{
PORTC^=(1<<PC1);
_delay_us(900);
}
if (aktuell_pwm_l >= 100 && aktuell_pwm_l < 102)
{
PORTC^=(1<<PC1);
_delay_us(950);
}
if (aktuell_pwm_l >= 102 && aktuell_pwm_l < 104)
{
PORTC^=(1<<PC1);
_delay_us(1000);
}
if (aktuell_pwm_l >= 104 && aktuell_pwm_l < 106)
{
PORTC^=(1<<PC1);
_delay_us(1200);
}
if (aktuell_pwm_l >= 106 && aktuell_pwm_l < 108)
{
PORTC^=(1<<PC1);
_delay_us(1400);
}
if (aktuell_pwm_l >= 108 && aktuell_pwm_l < 110)
{
PORTC^=(1<<PC1);
_delay_us(2000);
}
if (aktuell_pwm_l >= 110 && aktuell_pwm_l < 112)
{
PORTC^=(1<<PC1);
_delay_us(6000);
}
if (aktuell_pwm_l >= 112 && aktuell_pwm_l < 114)
{
PORTC^=(1<<PC1);
_delay_us(10000);
}
if (aktuell_pwm_l >= 114 && aktuell_pwm_l < 116)
{
PORTC^=(1<<PC1);
_delay_us(14000);
}
if (aktuell_pwm_l >= 116 && aktuell_pwm_l < 118)
{
PORTC^=(1<<PC1);
_delay_us(18000);
}
if (aktuell_pwm_l >= 118 && aktuell_pwm_l < 120)
{
PORTC^=(1<<PC1);
_delay_us(200000);
}
if (aktuell_pwm_l >= 120 && aktuell_pwm_l < 122)
{
PORTC^=(1<<PC1);
_delay_us(200000);
}
if (aktuell_pwm_l >= 122 && aktuell_pwm_l < 124)
{
PORTC &= ~(1<<PC1);
}
}
}
Über eure Hilfe würde ich mich sehr freuen.
LG
Digit-22