Witam.
Myślę nad wykonaniem zasilacza laboratoryjnego sterowanego uC. Napisałem program w BASCOMIE bez większych kłopotów, jednak w wersji demo, przez ogranicznie długości kodu program był niekompletny. Postanowiłem porzucić Bascoma i nauczyć się C. Na początek sam PWM. Oto co udało mi się napisać :
Jednak układ nie działa tak jak bym chciał. Wszystko symuluję, przy rozdzielczości 10-bit, mam 1024 kroki regulacji. Więc przy 5V jakies 4,88mV.
Jednak tak pięknie nie jest. Gdy ustawię OCR1A = 512 to napięcie spada do 0V.
Wystarczyła by mi rozdzielczość 8-bit :
Jednak wtedy to dopiero dzieją się cuda. Przez cały czas na wyjściu mam stan wysoki.
Co robić ? Może mam źle ustawiony rejestr TCCR1 - ustawiałem go zgodnie z datasheet.
Dodano po 47 [minuty]:
Skorzystam z Timer 0. Wyczytałem z datasheet jak z niego skorzystać i urodziłem taki kod :
Wszystko niby dobrze ustawione, a nadal zero efektów, tak jakby timer wogole nie wsytartowal.
Myślę nad wykonaniem zasilacza laboratoryjnego sterowanego uC. Napisałem program w BASCOMIE bez większych kłopotów, jednak w wersji demo, przez ogranicznie długości kodu program był niekompletny. Postanowiłem porzucić Bascoma i nauczyć się C. Na początek sam PWM. Oto co udało mi się napisać :
Cytat:
#include <avr\io.h>
void pwm_init(void) //procedura wlaczajaca pwm
{
DDRB=0b00000010;
TCCR1A = 0b10000010;
TCCR1B = 0b00011001;
ICR1 = 1000; //okres PWM
OCR1A = 0; //szerokosc impulsu max - 1023 - 10bit PWM - poczatkowa wartosc = 0
}
void pwm(unsigned short int wypelnienie) // zmiana wypelnienia
{
if (wypelnienie>=1023) wypelnienie=1023;
else
OCR1A = wypelnienie;
}
void portinit(void);
int main(void) {
unsigned short int wypelnienie=0;
pwm_init();
DDRD=0x00;
PORTD=0xFF;
while(1)
{
pwm(wypelnienie);
if (!(PIND & 0x01)) wypelnienie++;
if (!(PIND & 0X02)) wypelnienie--;
}
}
Jednak układ nie działa tak jak bym chciał. Wszystko symuluję, przy rozdzielczości 10-bit, mam 1024 kroki regulacji. Więc przy 5V jakies 4,88mV.
Jednak tak pięknie nie jest. Gdy ustawię OCR1A = 512 to napięcie spada do 0V.
Wystarczyła by mi rozdzielczość 8-bit :
Cytat:
TCCR1A = 0b10000001;
TCCR1B = 0b00010001;
Jednak wtedy to dopiero dzieją się cuda. Przez cały czas na wyjściu mam stan wysoki.
Co robić ? Może mam źle ustawiony rejestr TCCR1 - ustawiałem go zgodnie z datasheet.
Dodano po 47 [minuty]:
Skorzystam z Timer 0. Wyczytałem z datasheet jak z niego skorzystać i urodziłem taki kod :
Cytat:
#include <avr\io.h>
int main(void)
{
DDRD=0xFF;
TCCR0|=0b01011001; //licznik T0 tryb pWM , prescaler = 0
TCNT0=0; //wartosc poczatkowa rejestru zliczania
while(0)
{
if (TIMSK & 0x01) PORTD = 0XFF; //jezeli zostanie ustawiona flaga TOV0 - Timer 0 overflow to ustaw portd
}
}
Wszystko niby dobrze ustawione, a nadal zero efektów, tak jakby timer wogole nie wsytartowal.
