Bygga en scooter.

Berätta om dina pågående projekt.
Euphaz
Inlägg: 49
Blev medlem: 18 juni 2004, 23:21:07

Inlägg av Euphaz »

>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?
Spectator
Inlägg: 8
Blev medlem: 20 juli 2004, 21:32:05
Ort: Västerås

Inlägg av Spectator »

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.
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

låter helt klart intresant det där med en digital förstärkare. lova att skapa en ny tråd och hålla igång den sen :]
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Inlägg av Jonaz »

$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.
Hittade inget om det?.... Har MEGA8515, MEGA32 och en MEGA64 (64'an inte uppkopplad ännu)

Finns det med på nån utav dom tro?
Spectator
Inlägg: 8
Blev medlem: 20 juli 2004, 21:32:05
Ort: Västerås

Inlägg av Spectator »

>chille

Det kommer strax :)

>Jonaz

Mega8515 har 3st hårdvaru pwm enligt databladet.
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Inlägg av Jonaz »

På vilken sida hittade du det?
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg av MicaelKarlsson »

Jonaz: http://www.avrfreaks.net/Devices/
Här finns en sida där du kan jämföra olika AVR
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

Jonaz skrev:
$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.
Hittade inget om det?.... Har MEGA8515, MEGA32 och en MEGA64 (64'an inte uppkopplad ännu)

Finns det med på nån utav dom tro?
Leker för tillfället med 32:an, den har hårdvaru pwm, 64:an lär ha det också.
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%
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Inlägg av Jonaz »

Jag mendae vilken sida i databladet. jag är nog blind för jag hittar det inte.
Finns det några exempel med hårdvaru PWM? har ingen koll på det.
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

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.
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Inlägg av Jonaz »

´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
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1652
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

BASCOM-AVR har en inbyggd programerade som stöder STK500 mm.
Senast redigerad av RDX* 26 juli 2004, 03:16:56, redigerad totalt 1 gång.
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1652
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

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.
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

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:

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 ();
}
Om du sen kollar på tabellerna i doc-filen för TCCR1A och TCCR1B så ser du vad de olika bitarna innebär.

Kod: Markera allt

pwm=a2dConvert10bit(0);
freq=a2dConvert10bit(2);
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.
Användarvisningsbild
Jonaz
Inlägg: 2358
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Inlägg av Jonaz »

Får läsa detta nån dag nu när man får tid...
Skriv svar