Er moet toch wel meer dan 1khz uit 1 PWM te halen zijn? (software) Straks hoor je nog bij 6PWM's het getik van de motoren omdat ze zo langzaam gaan :S

Wat is de klok dan? Want die atmega163 kan even snel lopen als de atmega32, waarop -EasY-- met een 16Mhz kristal 122Khz 4 kanaals PWM haalt.

Als de if.... zo zwaar is misschien volgende proberen :

Ipv de software timer de hardwaretimer (8bits voor 255 stapjes) gebruiken en dan bij een compare match een interrupt laten afgeven. dus > Je wilt 50% PWM hebben. Dat is ongeveer 128 (255*05). Je stelt de compare match in op 128 en laat de timer lopen. (en een pin hoog maken) Bij 128 geeft de timer een interupt, de interupt verwijst door naar een pin laag maken. etc etc. Bij meerdere PWMs laat je de compare matchh steeds veranderen van klein naar groot. Dus als je 3 pwm's hebt, met de volgende instellingen 60%, 50% en 90% laat je de compare macth eerst doen op 128 (50%), na deze match maakt ie de betreffende pin laag, en zet die meteen de match op de volgende PWM, 153 (60%) enz. Gaat dat lukken?

Alleen, als je ervoor zorgt dat een andere procedure de PWM routine onderbreekt heb je dus geen zuivere PWM meer, klopt dat? :)

Benadski, of iemand anders
zou je mij misschien een voorbeeldje kunnen sturen. Hoe je 32 Pwm kanalen krijgt?? ik hoef er eigenlijk maar 12 aan te sturen maar dan snap ik het principe tenminste.

bouwie_2000@hotmail.com

Op 19 november 2003 12:54:00 schreef Fixation:
Benadski, of iemand anders
zou je mij misschien een voorbeeldje kunnen sturen. Hoe je 32 Pwm kanalen krijgt?? ik hoef er eigenlijk maar 12 aan te sturen maar dan snap ik het principe tenminste.

bouwie_2000@hotmail.com

In professionele motoraansturingen zul je het pwm signaal automatisch laten genereren door de hardware of een nauwkeurige timer-interrupt met hoge prioriteit gebruiken. Het volgende fragmentje geeft een globaal idee van hoe je zoiets zou kunnen implementeren. De uitwerking is een leuke oefening..

Let op dat je sommige global variables volatite definieert om te voorkomen dat de optimalizatie van de compiler roet in het eten gooit!

Globaal idee:
Je hebt een drietal arrays emt daarin de gewenste pwm niveaus voor de 32 kanalen (0-255), een pointer to de uitgangspoort en een pointer naar de pin op die poort.
Een timer loopt elke x usec af en genereert het pwm signaal.


// Global variables, defines, include
 
 
#define TIMER1_VAL   0xC02B   // (100msec@8Mhz+64divider)


volatile unsigned char PwmLevel[32]; 
volatile unsigned char Count1


etc..


// Interrupt function
// Called on every timer overflow


INTERRUPT (SIG_OVERFLOW1)
{
  unsigned char idx;
  // RESET TIMER/COUNTER
  TCNT1 = TIMER1_VAL;	
  // Inc counter
  Count1++'
  // Generate pwm
  for (idx=0;idx<32;idx++) {
    if (PwmLevel[idx]<Count1) {
      sbi(PointerToPort[idx],PointerToPin[idx]);
    } else {
      cbi(PointerToPort[idx],PointerToPin[idx]);
    };
  };
}


// Main function


int main(void) {
  // Initialize timer 1 here
  // Set pwm levels
  // Interacion with other components, etc.
}

Okee ik heb ook rond de 6 pwm kanalen nodig op mijn AVR.. maar nou zit ik te denken omdat ik naast het PWM gedeelte ook veel rekenwerk heb op de ingang (dmx 512 protocol) Zoek ik een manier waardoor ik extern PWM kan maken.. dus met de controller die bepaalde gegevens geeft over pwm signaal en exstern tot echt pwm wordt gemaakt.. Is dit mogelijk en zoja HOE??

BTW weet iemand een goed forum over AVR met bascom avr proggen??

Je neemt een AVR/PIC voor je DMX die om de zoveel tijd een waarde (0-255) per PWM kanaal doorstuurt naar een andere PIC/AVR die dan de PWM doet.

Het is hier stil geworden... Is het project al gelukt??

ikd enk eigenlijk een betje een multiplexing hier,maar hangt af van de toepassing