Bygga en scooter.
>Sub-förstärkaren låter helt klart intressant! Jag kom på nu att en A/D på en PIC faktist är kapabel att sampla några 100kSamples/s, det bör räcka för en sub iaf
Såg i databladet till 16F870, A/D-sidorna, en omvandling tar 20uS. Det blir ju 50KHz. Sedan måste kanske omvandlaren återhämta sig i mellan.
Allafall klarar PIC A/D över 20KHz sample, PWM klarar samma frekvens, och båda stöder 10bit. Utmaningen blir ju att designa en bra snabb H-brygga.
>Den tar jag emot spdif signalen från cd-spelaren
Vad innehåller den signalen egentligen?
Såg i databladet till 16F870, A/D-sidorna, en omvandling tar 20uS. Det blir ju 50KHz. Sedan måste kanske omvandlaren återhämta sig i mellan.
Allafall klarar PIC A/D över 20KHz sample, PWM klarar samma frekvens, och båda stöder 10bit. Utmaningen blir ju att designa en bra snabb H-brygga.
>Den tar jag emot spdif signalen från cd-spelaren
Vad innehåller den signalen egentligen?
SPDIF står för Sony-Philips Digital Interface Format.
Det är den signal dom flesta cd-spelare, dat-spelare och ljudkort med digital utgång använder för att prata med externa D/A-omvandlare eller dyligt. Den sänds över koax- eller toslinkkabel.
Den sänder 32-bitars paket med information om vänster/höger kanal samt 16->24bitars sampel och några bitar för kontroll, kopierings skydd mm.
Det är den signal dom flesta cd-spelare, dat-spelare och ljudkort med digital utgång använder för att prata med externa D/A-omvandlare eller dyligt. Den sänds över koax- eller toslinkkabel.
Den sänder 32-bitars paket med information om vänster/höger kanal samt 16->24bitars sampel och några bitar för kontroll, kopierings skydd mm.
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
Leker för tillfället med 32:an, den har hårdvaru pwm, 64:an lär ha det också.Jonaz skrev:Hittade inget om det?.... Har MEGA8515, MEGA32 och en MEGA64 (64'an inte uppkopplad ännu)$tiff skrev:
Har din AVR stöd för hårdvaru-PWM så använd den , det är nästa lika enkelt som du tror.
Finns det med på nån utav dom tro?
Relativt enkel att ställa in, men kan vara lite klurigt till en början. Den kan köras i 15 olika lägen, gäller att ställa in alla register rätt.
Men då den har både 8 bitars räknare och 16 bitars räknare blev det lite jobbigt när jag ville ha 4 pwm utgångar som som styrdes på samma sätt, så jag gjorde en i mjukvaran istället.
Grovt räknat med in interrupt slinga på 80 cykler så var cpu användningen till en början 50%, med lite optimering bör den nu ligga runt 8%
Det finns under rubrikerna som heter något i stil med timer/count/compare
La upp en zip fil innehållades det man behöver från databladet sammanställt i en doc-fil tillsammans med lite c-kod:
http://guldgruvan.mine.nu/avr.zip
Kolla på servo.c
Det tog lite tid att få den koden att fungera men nu kan man iaf justera både frekvens och pulsbredd via ad ingångarna (har vridpottar där), dom flesta exempel jag hittat kör med fast frekvens.
La upp en zip fil innehållades det man behöver från databladet sammanställt i en doc-fil tillsammans med lite c-kod:
http://guldgruvan.mine.nu/avr.zip
Kolla på servo.c
Det tog lite tid att få den koden att fungera men nu kan man iaf justera både frekvens och pulsbredd via ad ingångarna (har vridpottar där), dom flesta exempel jag hittat kör med fast frekvens.
´Tittade igenom doc-filen men det sa mig inte så mycket.
Som jag fattade så kommer PWM signalen ut på OC1A och OC1B.
Provade att programera med servo.c filen och satte en LED på OC1A den lös men inget mer. Skall leta fram ett servo och koppla in istället för det är väl det som är meningen?
Men om man vill ändra på pulsbredden och frekvensen hur skall man göra då? du skrev att du hade en vrid pott.? Var kopplar du in den?
EDIT>> Vilket program skall man andvända för att programera dom filerna med? Jag kör nu med BASCOM-AVR
Som jag fattade så kommer PWM signalen ut på OC1A och OC1B.
Provade att programera med servo.c filen och satte en LED på OC1A den lös men inget mer. Skall leta fram ett servo och koppla in istället för det är väl det som är meningen?
Men om man vill ändra på pulsbredden och frekvensen hur skall man göra då? du skrev att du hade en vrid pott.? Var kopplar du in den?
EDIT>> Vilket program skall man andvända för att programera dom filerna med? Jag kör nu med BASCOM-AVR
Kolla in appnote 112hos bascom.
Där används en hårdvaru PWM för att driva en motor.
Jag har själv byggt ett reglage efter detta AN och det fungerade alldeles utmärkt.
Där används en hårdvaru PWM för att driva en motor.
Jag har själv byggt ett reglage efter detta AN och det fungerade alldeles utmärkt.
doc-filen är mer en sammaställning på alla register och hur de kan ställas in.
Upptäckte lite fel i koden, hade en fungerande hårdvarupwm skriven på egen hand förrut men den blev överskriven när jag gjorde om det i mjukvara.
Ett fel är att den ställer in C portens OC1 som inte finns, ska vara D porten.
Dvs inte DDROC=_BV(OC1) som i filen du fick utan som nedan, DDRC=_BV(OC1), kan använda PD5 också för att peka rätt på pinne 5 på d-porten om inte OC1 fungerar.
Det viktiga i koden är framför allt detta:
Om du sen kollar på tabellerna i doc-filen för TCCR1A och TCCR1B så ser du vad de olika bitarna innebär.
Dessa två rader läser in ett 10 bitars värde från AD0 resp AD2. Den koden har jag plockat rakt av utan att titta närmare på AD:n, sparade tid. Koppla vardera sida på en vridpot till VCC resp ground och mittenstiftet till vald AD-ingång.
Såg sen att det kanske inte var det bästa exemplet att ge, var väl ungefär det jag programmerade efter att ha lärt mig "Hello World"
Endel av kommentarerna är lite fel med tanke på att jag experimenterat lite med värdena. Dessutom är det en rätt ful lösning i interruptrutinen.
Men ICR1 styr längden på hela pulsen, just nu räknar den till 10000 med 8 ggrs prescaling, dvs 1/2E6*10000, dvs 5 ms * 2 för den räknar upp och ner om jag minns rätt. Har inte allt uppkopplat annars hade jag mätt upp och verifierat med oscilloskopet.
Pulsbredden när den är en etta styrs här av OCR. Minivärdet på 600 ger 1/2E6*600 = 0.3 ms * 2 = 0.6ms (av nån anledning låg endläget på mitt servo så här pass långt ner).
Nu inser jag att det här kanske inte är så pass stor hjälp med tanke på allt inte är 100% korrekt, men jag hoppas det hjälpt lite på vägen.
Men läs från sidan 84 i databladet, där förklaras allt bra.
"Modes of operation" som börjar på sidan 96 tåls att läsas ett antalg ggr så man har det klart för sig hur den jobbar.
Upptäckte lite fel i koden, hade en fungerande hårdvarupwm skriven på egen hand förrut men den blev överskriven när jag gjorde om det i mjukvara.
Ett fel är att den ställer in C portens OC1 som inte finns, ska vara D porten.
Dvs inte DDROC=_BV(OC1) som i filen du fick utan som nedan, DDRC=_BV(OC1), kan använda PD5 också för att peka rätt på pinne 5 på d-porten om inte OC1 fungerar.
Det viktiga i koden är framför allt detta:
Kod: Markera allt
ioinit (void)
{
a2dInit(); // Initierar ADC
// Using phase & freq correct pwm, TOP=ICR1, freq scaling = 8
TCCR1A = _BV (COM1A1); // Se table 46 COM1A1=1 & COM1A0=0
TCCR1B = _BV (CS11) | _BV (WGM13); // För WGM13, se table 47
// För CS11, se table 48
/* set PWM value to 0 */
OCR = 0;
ICR1 = 0;
/* enable OC1 */
DDRD = _BV (OC1);
//DDRD=_BV(PD5);
//DDRD= 0xFF; // bra för felsökning, ställer alla pinnar på portd till utgång
timer_enable_int (_BV (TOIE1));
/* enable interrupts */
sei ();
}
Kod: Markera allt
pwm=a2dConvert10bit(0);
freq=a2dConvert10bit(2);
Såg sen att det kanske inte var det bästa exemplet att ge, var väl ungefär det jag programmerade efter att ha lärt mig "Hello World"

Endel av kommentarerna är lite fel med tanke på att jag experimenterat lite med värdena. Dessutom är det en rätt ful lösning i interruptrutinen.
Men ICR1 styr längden på hela pulsen, just nu räknar den till 10000 med 8 ggrs prescaling, dvs 1/2E6*10000, dvs 5 ms * 2 för den räknar upp och ner om jag minns rätt. Har inte allt uppkopplat annars hade jag mätt upp och verifierat med oscilloskopet.
Pulsbredden när den är en etta styrs här av OCR. Minivärdet på 600 ger 1/2E6*600 = 0.3 ms * 2 = 0.6ms (av nån anledning låg endläget på mitt servo så här pass långt ner).
Nu inser jag att det här kanske inte är så pass stor hjälp med tanke på allt inte är 100% korrekt, men jag hoppas det hjälpt lite på vägen.
Men läs från sidan 84 i databladet, där förklaras allt bra.
"Modes of operation" som börjar på sidan 96 tåls att läsas ett antalg ggr så man har det klart för sig hur den jobbar.