Strona 1 z 1

Zmiejszenie programem napięcia i prądu na wyjściu Atmega 8A

: wtorek 08 maja 2018, 13:25
autor: Ada20
Witam !
Czy można zmniejszyć na wyjściu Atmega8A, napięcie na 1 Volt i natężenie prądu na 1 miliamper ,modyfikując poniższy program,proszę o gotowca.
Jeśli nie można zmienić programowo,to jak ?,rezystorem prąd,a czym napięcie?
Nie jest to zadanie na studiach.
Studia historyczne ukończyłam kilkadziesiąt lat temu.

Program:

#include <avr/io.h>
#include <util/delay.h>

int main (void)
{
DDRB = (1<<PB0)|(1<<PB1);
PORTB|=(1<<PB0);
while(1)
{

PORTB ^= (1<<PB0)|(1<<PB1);
_delay_ms(60000);
}
}


Z góry dziękuję za odpowiedz.
Pozdrawiam
Ada

: wtorek 08 maja 2018, 14:51
autor: GanzConrad
Z tego co (pobieżnie) widzę, program neguje wyjścia B0 i B1 co 60s i ma się nijak do tego co napisałaś. Co minutę, na portach wystąpi stan wysoki (czyli napięcie zasilania) na zmianę z niskim, a obciążalność pojedynczego portu wynosi maksymalnie 40mA.
Wrzuć schemat, może czymś to steruje ?
Nie da się bezpośrednio sterować napięciem i prądem na "wyjściach", czyli portach Atmegi. Robi się to generując PWM i zamianę go na napięcie poprzez filtr RC:
https://mikrokontrolery.blogspot.com/20 ... a-dac.html
Jeśli dobrze się domyślam, to zmianę napięcia uzyskasz eksperymentując z wartością funkcji _delay_ms(). Zmniejszaj ją tak długo, aż osiągniesz zamierzony efekt (nawet do pojedynczych ms)

: wtorek 08 maja 2018, 16:16
autor: Pyra
Witam

Zależy z jaką dokładność parametrów chcesz osiągnąć, najprościej zrobić dzielnik napięcia (chyba, że obciążeniem jest coś o rezystancji 1k, bo wspominasz o prądzie 1mA).
Jeśli ten 1V nie jest wymagany z dużą dokładnością, to przy 1mA wystarczy szeregowo do każdego portu, dodać rezystor 3,9k.
Można zastosować rezystor ograniczający i diodę Zenera np. taką, trochę większe napięcie można uzyskać stosując do stabilizacji dwie połączone szeregowo diody prostownicze.
Obrazek
Ale przy odrobinie szczęścia, można dobrać odpowiednie diody, aby osiągnąć wymagane napięcie 1V.

Jeśli chodzi o PWM, to i tak trzeba by zrobić układ całkujący, czyli układ RC, który wygładzi pulsację.

Pozdrawiam

: wtorek 08 maja 2018, 17:15
autor: Ada20
Witam
Dziękuję za odpowiedzi.
Czy można tak zrobić programowo, w/w programie , lub innym, aby Atmega8A wyłączyła się po 12 godzinach.
Jaki program na Atmega 8a ,da najdokładniejsze wypełnienie (duty) 50%, 60 sekund wysoki stan, 60 sekund niski stan,który dzieli częstotliwość na 2 części, tak jak w CD4047 ?, lub inny program,proszę o taki program
Jak można zrobić multiwibrator astabilny duty 50 %,czasie 60 sekund razem 120 sekund bez elementów RC ,bez mikro kontrolerów,bo np.na CD4047 potrzeba RC.
Pan Górnicki napisał:
""Praktycznie wszystkie generatory RC z bramkami nie dają przebiegu o wypełnieniu dokładnie 50 %-jest to wspólna cecha wszystkich prostych generatorów.
Taki symetryczny przebieg otrzymasz w każdym układzie z licznikiem"

Jak zbudować multiwibrator astabilny na układzie z licznikiem,jaki to np.układ

Pozdrawiam
Adela

: wtorek 08 maja 2018, 19:01
autor: ptja
Ada20 pisze:Czy można tak zrobić programowo, w/w programie , lub innym, aby Atmega8A wyłączyła się po 12 godzinach.
tak. Wyjdź z pętli i uśpij procesor po 720 wykonaniach.

: piątek 18 maja 2018, 22:03
autor: Ada20
Witam
Co trzeba przerobić w niżej podanym programie na Arduino, aby działał na Atmega 8A na wyjsciach PB0 i PB1.

60 sekund LOW i 60 sekund High.

Oto program:

#define LED1 3
#define LED2 4

int stanLED1 = LOW;
int stanLED2 = LOW;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasLED1 = 0;
unsigned long zapamietanyCzasLED2 = 0;

void setup(){
Serial.begin(9600);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
}

void loop(){
//Pobierz liczbe milisekund od startu
aktualnyCzas = millis();

//Jeśli różnica wynosi ponad 1 sekundę
if (aktualnyCzas - zapamietanyCzasLED1 >= 1000UL) {
//Zapamietaj aktualny czas
zapamietanyCzasLED1 = aktualnyCzas;
//Zmieniamy stan diody na przeciwny
stanLED1 = !stanLED1;
//ustawiamy nowy stan na diodzie
digitalWrite(LED1, stanLED1);
}

//Jeśli różnica wynosi ponad 0,5 sekundy
if (aktualnyCzas - zapamietanyCzasLED2 >= 500UL) {
//Zapamietaj aktualny czas
zapamietanyCzasLED2 = aktualnyCzas;
//Zmieniamy stan diody na przeciwny
stanLED2 = !stanLED2;
//ustawiamy nowy stan na diodzie
digitalWrite(LED2, stanLED2);
}
}


Pozdrawiam
Adela