Page 1 of 1

PWM 1Mhz

PostPosted: 19 Sep 2013, 15:34
by tnnbascom
Salve,
devo generare un PWM con frequenza a 1Mhz...
utilizzo un micro ATmega32, con il codice seguente sono riuscito a generare un pwm con duty cycle 50%

Non ho margine per variare il duty cycle, come posso risolvere?

Code: Select all
$regfile = "m32def.dat"                                     
$crystal = 16000000
$baud = 115200

Config Portd.2 = Output                                     'BUZZER

Config Portd.5 = Output

Buzzer Alias Portd.2

Declare Sub Bip

'2. Set Timer1 registers to Fast-PWM Mode with ICR1 as TOP Value (Mode 14),Compare A = Clear down:

Tccr1a = &B10000010                                         
                    'Bit 7:6 – COM1A1:0: Compare Output Mode for channel A set to 10
                      '        = Clear OC1A on Compare Match, set OC1A at TOP
                     'Bit 5:4 – COM1B1:0: Compare Output Mode for channel B set to 00
                      '        = Normal port operation, OC1B disconnected.
                     'Bit 3 – FOC1A: Force Output Compare for channel A set to 0 - not used in PWM
                      'Bit 2 – FOC1B: Force Output Compare for channel B set to 0 - not used in PWM
                      'Bit 1:0 – WGM11:0: Waveform Generation Mode set to ..10
                     '        = lower bits of Mode 14: fast PWM; TOP = ICR1

Tccr1b = &B00011010                                         
                     'Bit 7 – ICNC1: Input Capture Noise Canceler set to 0 - not used in PWM
                      'Bit 6 – ICES1: Input Capture Edge Select set to 0 - not used in PWM
                      'Bit 5 – Reserved Bit set to 0
                     'Bit 4:3 – WGM13:2: Waveform Generation Mode set to 11..
                     '        = higher bits of Mode 14: fast PWM; TOP = ICR1
                     'Bit 2:0 – CS12:0: Clock Select set to
                     '        = higher bits of Mode 14: fast PWM; TOP = ICR1
                     'Bit 2:0 – CS12:0: Clock Select set to 010 = clkI/O / 8 (From prescaler)

'Icr1 = (fclk_I/O / (fOCnxPWM * N)) - 1

Icr1 = 1  '(16000000 / (8 * 1000000)) - 1                                                   

Pwm1a = 0                  '50%

Waitms 1

Bip

Do
Loop

Sub Bip
   Buzzer = 0
   Waitms 20
   Buzzer = 1
End Sub

Re: PWM 1Mhz

PostPosted: 20 Sep 2013, 09:23
by tnnbascom
Set the clock bits CS12:0 to 001, which gives you a prescaler of 1.
Set ICR1 to 15, so you get a 1MHz PWM.
Now you set PWM1a to 0...15.


Risolto... :D

Re: PWM 1Mhz

PostPosted: 08 Oct 2013, 15:14
by tnnbascom
Salve,

Io ho bisogno di 4 PWM regolabili indipendentemente: due a 1Mhz , uno a 2500Khz e uno a 40Khz....

con il codice seguente ottengo un segnale PWM, da 1Mhz sul pin19 (OC1A)...

ma con questo microprocessore non posso poi generare gli altri PWM... quale micro mi consigliate?

Grazie.

Code: Select all
$regfile = "m32def.dat"                   
$crystal = 16000000

'2. Set Timer1 registers to Fast-PWM Mode with ICR1 as TOP Value (Mode 14),Compare A = Clear down:

Tccr1a = &B10000010                                         'Bit 7:6 – COM1A1:0: Compare Output Mode for channel A set to 10
                      '        = Clear OC1A on Compare Match, set OC1A at TOP
                     'Bit 5:4 – COM1B1:0: Compare Output Mode for channel B set to 00
                      '        = Normal port operation, OC1B disconnected.
                     'Bit 3 – FOC1A: Force Output Compare for channel A set to 0 - not used in PWM
                      'Bit 2 – FOC1B: Force Output Compare for channel B set to 0 - not used in PWM
                      'Bit 1:0 – WGM11:0: Waveform Generation Mode set to ..10
                     '        = lower bits of Mode 14: fast PWM; TOP = ICR1

Tccr1b = &B00011001                                         'Bit 7 – ICNC1: Input Capture Noise Canceler set to 0 - not used in PWM
                      'Bit 6 – ICES1: Input Capture Edge Select set to 0 - not used in PWM
                      'Bit 5 – Reserved Bit set to 0
                     'Bit 4:3 – WGM13:2: Waveform Generation Mode set to 11..
                     '        = higher bits of Mode 14: fast PWM; TOP = ICR1
                     'Bit 2:0 – CS12:0: Clock Select set to
                     '        = higher bits of Mode 14: fast PWM; TOP = ICR1
                     'Bit 2:0 – CS12:0: Clock Select set to 010 = clkI/O / 8 (From prescaler)

Icr1 = 15                                                 

I = 3                                                       

Pwm1a = I

Re: PWM 1Mhz

PostPosted: 08 Oct 2013, 21:57
by js-bascom
Il M32 e' "vecchissimo", dai un'occhiata alla famiglia Mega164p-Mega1284p che hanno lo stesso "pin out", altrimenti potresti investigare gli Xmega pero' al rischio di diventare pazzo.

Re: PWM 1Mhz

PostPosted: 09 Oct 2013, 20:10
by deluca
Come già detto da js-bascom,
puoi provare con atmega1284p con il quale potresti gestire fino a 6 pwm.

Altra soluzione è adottare "xmega" ma quella "x" sta proprio lì per complicarti la vita.....

Re: PWM 1Mhz

PostPosted: 10 Oct 2013, 09:46
by Leonardo
Volevo solo demistificare gli XMega, hanno più funzionalità e quindi maggiori opzioni tra cui scegliere.

Però utilizzando la libreria ufficiale Atmel (ASF) non è così complicato gestire il PWM.. certo se si vogliono utilizzare direttamente i registri si è liberi di farlo.

Prova a dare un'occhio all'esempio: http://asf.atmel.com/docs/latest/xmega.services.pwm.example1.xmega-a1_xplained/html/pwm_quickstart.html

Ciao

Re: PWM 1Mhz

PostPosted: 10 Oct 2013, 10:59
by deluca
@leonardo,
come ben hai detto, se si ha a che fare con xmega, l'approccio alla programmazione con asf è molto semplice e intuitivo.
Atmel con asf ci è stata di grande aiuto in molti dei ns progetti basati su xmega-controller.

Purtroppo credo che @tnnbascom sappia programmare solamente in Bascom-avr e quindi gli consiglio di cambiare micro passando ad un atmega1284p e di leggerene attentamente il datasheet

..... per tutto il resto c'è ASF.... concordo.

Re: PWM 1Mhz

PostPosted: 10 Oct 2013, 13:25
by tnnbascom
grazie a tutti... seguirò, per una questione di tempo, il consiglio di deluca e proverò con un atmega1284p... ;)

p.s.: Leonardo grazie del consiglio... sempre tempo permettendo :x , darò un occhiatina all' atmel(ASF) non si sa mai.... anzi se esistesse qualche tutorial vi sarei grato :D

Re: PWM 1Mhz

PostPosted: 10 Oct 2013, 22:00
by Leonardo
Se hai tempo e vuoi valutare ASF puoi partire da alcuni articoli che ho scritto sul mio blog: http://electro-logic.blogspot.it/p/indice-articoli-su-asf.html

Ciao

Re: PWM 1Mhz

PostPosted: 10 Oct 2013, 22:15
by js-bascom
Beati voi che sapete usare l'ASF, per me e' un MOSTRO!! Per esempio un semplice modo di usare il DAC sembra che usi circa 40 directories e dozzine di files quando richiede solo QUATTRO LINEEE di codice per impostartlo!

Comunque capisco che in Italia siete molto piu' intelligenti :mrgreen: , ho speso due giorni ad un "training seminar" (come si dice boh??) di Wurth Electronics con l'Ing. Andrea De Gruttola e quel "ragazzo" e' fenominale, un genio!!

Re: PWM 1Mhz

PostPosted: 11 Oct 2013, 13:53
by tnnbascom
complimenti Leonardo ;)

Re: PWM 1Mhz

PostPosted: 14 Oct 2013, 15:53
by tnnbascom
Carissimi,
oggi sto provando a generare i segnali PWM che mi servono con ATmega1284p (consigliato da deluca)
voglio precisare che quando ho detto segnale da 2500KHz, mi correggo è di 2,5KHz...(meno male..)

Comunque sono riuscito a generare tutti i segnali (1MHz, 40KHz e 2,5KHz...) il problema è di averli tutti è 3 contemporaneamente su 3 pin differenti....

con il seguente codice per il TIMER1:

Code: Select all
Tccr1a = &B10000010                                         
Tccr1b = &B00011001                                         'PRESCALER 1

Icr1 = 15                                                   '399 = 40KHz - 6399 = 2,5KHz - 15 = 1MHz

I = 3                                                     
Pwm1a = I
Pwm1b = I


ho i vari segnali sul pin OC1A (pin19)....ok

Per impostare gli altri timer basta cambiare per esempio
Tccr1a, Tccr1b, Icr1, Pwm1a, Pwm1b
con Tccr2a, Tccr2b, Icr2, Pwm2a, Pwm2b per il timer2,etc... giusto?

Il problema è che ho errore con Icr2... non viene riconosciuta??

ho letto il datasheet ma mi sembra corretto...

grazie.

Re: PWM 1Mhz

PostPosted: 15 Oct 2013, 11:14
by tnnbascom
Mi scuso.... ho settato Ocr2a... ma sul pin OC2A(pin21), comunque, non ho nessun segnale???

Code: Select all
Tccr2a = &B10000010
                       
 Tccr2b = &B00011001 'PRESCALER 1

 Ocr2a = 250

 Y = 125

 Pwm2a = Y

Re: PWM 1Mhz

PostPosted: 15 Oct 2013, 13:33
by deluca
@tnnbascom,

ti volevo far notare che i timer dell' Atmega1284p non sono tutti uguali.

Timer1 e Timer3 sono a 16bit, Timer2 è un 8bit.
Quindi come da manuale, i registri corrispondenti necessitano di una configurazione completamente diversa, specie se si ha a che fare con il timer2.

Re: PWM 1Mhz

PostPosted: 15 Oct 2013, 14:28
by tnnbascom
infatti sto provando a fare varie configurazione dei registri TCCR2A e TCCR2B... ma non riesco a trovare quella giusta... :x

Re: PWM 1Mhz

PostPosted: 16 Oct 2013, 10:46
by tnnbascom
ok....
sbagliavo sul settaggio di COM2A1:0 e COM2B1:0...

il codice corretto per avere il segnale TIMER2 PWM su OC2b (pin20) e:

Code: Select all
Tccr2a = &B00100011
Tccr2b = &B00001010        'Prescaler 8
Ocr2a = 49                        '40KHZ 
Y = 25                               '50%
Pwm2b = Y 


Per il Timer1, invece ho effettuato questi settaggi tutto ok e sul OC1A (pin19) c'è il segnale PWM:

Code: Select all
Tccr1a = & B10000010
Tccr1b = & B00011001        'Prescaler 1
ICR1 = 15                          '1MHz
I = 7                                  '50%
Pwm1a = I


Siccome ho bisogno di 4 PWM (sul datasheet c'è scritto che questo microprocessore ha 6 PWM), devo utilizzare anche TIMER0 e TIMER3, per gli altri due segnali PWM che mi servono...

Potresti farmi un esempio su come settarli?

grazie.

Re: PWM 1Mhz

PostPosted: 16 Oct 2013, 11:06
by deluca
Gli altri timer 0 e 3 sono da 8 bit quindi nella configurazione dei registri non devi specificare l'estensione a o b.
ovviamente tenendo conto sempre delle specifiche riportate sul datasheet.

I pwm sono sei perchè vengono così prodotti:

2 dal timer 1
2 dal timer 3
1 dal timer 0
1 dal timer 2
------------
6 pwm con risoluzione duty-cycle a 8bit

Re: PWM 1Mhz

PostPosted: 16 Oct 2013, 13:52
by tnnbascom
Bene...
mi manca solo il Timer3... ho provato a settarlo in questo modo:

Code: Select all
Tccr3a = &B10000010
Tccr3b = &B00011001                                   'PRESCALER 1
Ocr3A = 15                                                  '1MHz  out OC3A(pin7) 
I = 7                                                            '50%
Pwm3a = I


ma il bascom, non riconosce le variabili ICR3 o OCR3A per settare il valore TOP? :evil:

Re: PWM 1Mhz

PostPosted: 16 Oct 2013, 14:28
by deluca
@tnnbascom,
Come ti ho già detto, tutto sta nel leggere attentamente il datasheet....

i registri Timer/Counter Output Compare nell' atmega1284p sono solo e soltanto i seguenti:

OCR0A, OCR0B, OCR1AL, OCR1AH, OCR1BL, OCR1BH
OCR2A, OCR2B, OCR3AL, OCR3AH, OCR3BL, OCR3BH

Non esiste il registro OCR3A :) esiste il LOW e l' HIGH

Re: PWM 1Mhz

PostPosted: 16 Oct 2013, 14:57
by tnnbascom
ok... infatti avevo notato... ma...

@Mark: They are missing in the regfile m1284pdef.dat.

Use CAPTURE3 instead of ICR3 and Compare3A or PWM3A instead of OCR3A


;)