PWM 1Mhz

Sezione dedicata al sistema di sviluppo BASCOM-AVR per i micro AVR
At90s, Attiny, Atmega e Xmega

PWM 1Mhz

Postby tnnbascom » 19 Sep 2013, 15:34

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
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby tnnbascom » 20 Sep 2013, 09:23

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
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby tnnbascom » 08 Oct 2013, 15:14

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
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby js-bascom » 08 Oct 2013, 21:57

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.
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
User avatar
js-bascom
 
Posts: 176
Joined: 23 Mar 2013, 02:53
Location: Sydney, AUSTRALIA Ex Nunziata, Mascali (CT)

Re: PWM 1Mhz

Postby deluca » 09 Oct 2013, 20:10

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.....
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: PWM 1Mhz

Postby Leonardo » 10 Oct 2013, 09:46

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
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Re: PWM 1Mhz

Postby deluca » 10 Oct 2013, 10:59

@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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: PWM 1Mhz

Postby tnnbascom » 10 Oct 2013, 13:25

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
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby Leonardo » 10 Oct 2013, 22:00

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
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Re: PWM 1Mhz

Postby js-bascom » 10 Oct 2013, 22:15

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!!
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
User avatar
js-bascom
 
Posts: 176
Joined: 23 Mar 2013, 02:53
Location: Sydney, AUSTRALIA Ex Nunziata, Mascali (CT)

Re: PWM 1Mhz

Postby tnnbascom » 11 Oct 2013, 13:53

complimenti Leonardo ;)
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby tnnbascom » 14 Oct 2013, 15:53

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.
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby tnnbascom » 15 Oct 2013, 11:14

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
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby deluca » 15 Oct 2013, 13:33

@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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: PWM 1Mhz

Postby tnnbascom » 15 Oct 2013, 14:28

infatti sto provando a fare varie configurazione dei registri TCCR2A e TCCR2B... ma non riesco a trovare quella giusta... :x
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby tnnbascom » 16 Oct 2013, 10:46

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.
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby deluca » 16 Oct 2013, 11:06

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
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: PWM 1Mhz

Postby tnnbascom » 16 Oct 2013, 13:52

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:
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06

Re: PWM 1Mhz

Postby deluca » 16 Oct 2013, 14:28

@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
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: PWM 1Mhz

Postby tnnbascom » 16 Oct 2013, 14:57

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


;)
tnnbascom
 
Posts: 87
Joined: 27 Mar 2013, 15:06


Return to BASCOM-AVR

Who is online

Users browsing this forum: No registered users and 6 guests