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

....nie pasujące gdzie indziej...
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

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

Post 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
GanzConrad
Posty: 879
Rejestracja: wtorek 14 paź 2014, 20:44
Lokalizacja: Słupsk

Post 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)
Awatar użytkownika
Pyra
Site Admin
Posty: 8522
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post 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
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post 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
ptja
Posty: 2413
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post 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.
--
pozdrawiam,
Jarek Andrzejewski
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post 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
ODPOWIEDZ