Schema electronica microX3

  • In perioada urmatoare o sa vi se solicite modificarea parolei. Pana la modificarea parolei, userul poate figura ca si blocat, odata modificata parola, userul este reactivat automat.
    Pentru orice problema va rog folositi butonul "Contact"

lokomoto

Active Member
2 Mai 2008
97
2
Arad
YAHOO
lokomotodcc
LOCATION
Arad
Salutare,
Un post care poate fi util pasionatilor in masura in care au de depanat sau se
hotarasc sa realizeze un decodor de sunet cu interfata SUSI.

Poze cu originalul:





si schema extrasa:

 
Salut,
Cateva explicatii legate de frecventa semnalului PWM de iesire, din care cu ajutorul
amplificatorului jumatate clasa D si a celulei de filtrare trece jos L1-C9, rezulta semnalul audio.
Producatorul specifica ca, pentru incarcare fisiere th_.wav acestea trebuie sa fie
8bit si la un sample rate de 13021Hz.

Aceasta valoare rezulta din urmatoarele date interne ale microcontrolerului:
- Frecventa Oscilator Extern: 10MHz

- Modul intern PLL x4 , frecventa tact intern Fosc = 40Mhz

- Timer 2 folosit la generare PWM cu tact de intrare Fosc/4 adica 10Mhz

- Secventa: Fosc/4 ----> (Prescaler) ----> (Timer2) ----> (Postscaler)
10Mhz ----> 1:1 ----> 256 ----> 1:3
=> 10.000.000/1/256/3 = 13021Hz sample rate (bytes)

- PWM-ul generat de Timer2 are o frecventa de: 10.000.000/1/256 = 39063HHz
adica de 3 ori mai mult decat frecventa maxima a semnalului audio generat,
conform cu cerintele legate de frecventa de esantionare din teoria de
reconstructie semnalului analogic din esantioanele sale (vezi teorema Nyquist–Shannon),
in cazul de fata este frecventa PWM.

- Adica la fiecare a treia perioada PWM se reinoieste factorul de umplere cu
valoarea unei noi sample din memoria Flash.

- Rezolutia PWM-ului este de 10 bit cea ce permite o mixare fara clipping
a patru monstre th_.wav pe 8 bit.

- celula de filtrare trece jos L1 C9 are rolul de a rejecta frecventele mai mari
decat frecventa de taiere adica fc = 13021 (L=220uH si C9 = 680)

- la un tact intern de 40Mhz frecventa maxima la tactul comunicatiei SPI cu
memoria Flash este de 10Mhz. suficient timp sa citeasca esantioane pentru
4 sunete th_.wav si sa le mixeze. (de la 5 in sus incepe sa se "inece" sunetul).

- pentru SUSI foloseste modulul EUSART in modul sincron slave.

- o particularitate interesanta este modalitatea de criptare a fisierelor th_.waV
in interiorul memoriei flash (spread spectrum crypting), insa nu suficient de puternica ;),
insa sa trebuie sa recunosc ca il admir pe cel ce a gandit simplitatea si
implementarea algoritmului la nivelul unui microcontroler de 8 biti.
 
Salut !
Nu cumva rezolutia PWM este de 8 biti adica acel 256 de mai sus ?
Cum se face mixarea celor 4 sample ?
 
Salut
@dac : modul(ele) CCP si ECCP de la majoritatea microcontrolerelor Microchip din
seriile low and mid range 12F, 16F, 18F,...sunt cu rezolutie de 10 bit. si anume
in acest caz conform data sheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/41365E.pdf

pagina 111 / Capitolul 13.0
registrul de control al ECCP, CCP1CON bitii:
DC1B<1:0>: PWM Duty Cycle bit 1 and bit 0
PWM mode:
These bits are the two LSbs of the 10-bit PWM duty cycle.
The eight MSbs of the duty cycle are found in CCPR1L.

pagina 115/ Subcapitolul 13.4:
The Enhanced PWM mode can generate a PWM signal on up to four
different output pins with up to 10-bits of resolution.

pagina 115 fig/13-1/Nota 1:
"The 8-bit timer TMR2 register is concatenated with the 2-bit internal Q clock,
or 2 bits of the prescaler to create the 10-bit time base"
In aceasi figura vezi si Duty cycles Registers.

pentru a iti usura calculele vezi mai jos:
http://eng-serve.com/pic/pic_pwm.html
Frecventa: 40Mhz, Frecventa PWM 39063Hz, duty (la alegere), pe coloana 1
cu prescaler 1, rezulta Max duty Value 1024. (10biti).

Ca o idee wav PCM pe 8 biti cu semn sunt, de fapt, 7 biti fata de nivelul DC care in acest caz are valoarea 128 (0x80).
Mixarea la care s-ar gandi cineva imediat este prin adunare si mediere, insa rezultatul genereaza pierdere de rezolutie si volum. 1 bit aprox = 6dB.
La o adunare aritmetica simpla a 4 esantione diferite creste s-au scade amplitudea in mod liniar cea ce nu este conform cu auzul uman la care
sumarea se face logaritmic.
Mai multe despre mixare nu spun pentru ca asta ar insemna sa stric surpriza,..ups ;)
 
Pai sunt 10 biti rezolutie la o frecventa de 40 MHz, dar tu ai spus 10 MHz deci exact 8 biti rezolutie.

Chiar daca esantioanele sunt pe 7+1 biti, calculul se poate face intern pe 16 biti cu dithering la final si nu ai nici un bit pierdere la mixare. Intrebarea e daca exista suficienta putere de calcul pt. asta.

Ar mai fi solutia utilizarii celor 4 pini separat si mixarea externa a semnalelor audio.
 
dac a spus:
Pai sunt 10 biti rezolutie la o frecventa de 40 MHz, dar tu ai spus 10 MHz deci exact 8 biti rezolutie.
Ce legatura e intre rezolutia ADC-ului si frecventa de ceas?

LE Voiam sa zic PWM, da' e acelasi lucru.
LLE Asa-mi trebuie daca raspund la ceva in timp ce ma gandesc la altceva. Ma gandeam la ADC si raspundeam la un post despre PWM. Daca la ADC nu conteaza, la PWM nu sunt sigur, mai calculez. :oops:

LLLE Oricum in cazul asta e vorba de 10 biti pentru ca cei 10MHz sunt "frecventa interna" a PIC-ului (PICurile executa o instructiune in 4 cicli de ceas), in calcule folosindu-se frecventa ceasului "extern".
 
Salut,
Au recunoscut si cei de la Microchip ca arhitectura CCP in modul PWM
este putin ciudata vis-a-vis de cei doi biti LSB din duty cycle si este
putin mai greu de inteles la inceput insa smecheria asta urca de 4 ori
rezolutia si frecventa semnalului PWM generat, lucru pe care la rivalul
AVR (ATmega328) cu quartz de 20Mhz nu am reusit sa-l obtin.
La o citire mai atenta a datasheet ai sa constati cele de mai jos.

Ai dreptate tactul timerului TMR2 este Fosc/4 adica 10Mhz , insa comparatorul
la comparare cu registru de duty cycle concateneaza cei 8 biti
ai timer2 (cu clock 10 Mhz) cu inca doi biti ai counter-ului
pentru ciclul intern ( doar pentru prescaler = 1) counter care are la intrare
chiar Fosc adica (10x2^2 = 40Mhz) conform cea ce ti-am indicat in postul
anterior adica 2-bit internal Q clock, rezultand un timer de 10 bit cu tactul de
40 Mhz.

pagina 115 fig/13-1/Nota 1:
"The 8-bit timer TMR2 register is concatenated with the 2-bit internal Q clock,
or 2 bits of the prescaler to create the 10-bit time base"

Acesti doi biti LSB provin din:
vezi pag29/ FIGURE 3-3: CLOCK/INSTRUCTION CYCLE
si anume daca Fosc = Fquartth_PLL = 40 mhz
Executia unei intructiuni(simple) la PIC se face in 4 cicli (2 bit cycle counter)

Daca nu ma crezi cel mai simplu poti experimenta si poti evidentia pe
osciloscop doar modificand cei doi LSB pentru duty cycle.

La mixare se poate face o normalizare din int in float a esantioanelor,
dupa care se face mixarea si clipping-ul daca este necesar iar la final
rezultatul revine in int.
Nu stiu cata experienta ai cu seria 18F insa pot sa-ti spun ca putere de calcul
este suficienta, important este ca metoda folosita sa fie cat mai simpla pentru ca nu vorbim aici de DSP.
Pentru cei cu dare de mana se poate experimenta si urca mai sus la dsPIC, PIC24 sau chiar PIC32
 
Buna lokomoto,

schema e interesanta, dar si mai interesant ar fi de stiut daca ai si un soft la ea.
Ca desi ma mai joc din cand in cand cu PIC-uri (la un moment dat credeam chiar ca stiu sa le programez), softul pentru modulul asta nu mi se pare chiar trivial.

Spor la codat,
Liviu
 
Dar nu e mai simplu sa trimiti 4 fisiere audio la cele 4 iesiri PWM si sa mixezi analog sunetul ?

Uite inca o idee: daca tot folosesti PWM cu 10 biti rezolutie, nu mai bine utilizezi fisiere PCM codate a-law sau u-law pe 8 biti ( cu o rezolutie aparenta de ~12biti PCM liniar) ?
Diferenta subiectiva de calitate este mare.

Ramane de vazut daca exista suficienta putere pt. decodare in 12 biti PCM liniar si trunchiere la 10 biti...
 
Salut,
e simplu daca ai 4 module CCP separate insa nu si in cazul acestui tip de
microcontroler care are un singur modul ECCP si mai multe moduri de folosire
(multiplexare) a semnalelor de iesire (PWM simplu, Halfbridge, FullBridge).
Exista un mod de functionare la pag130, 13.4.7 PULSE STEERING MODE, care
poate crea confuzie insa nu se preteaza la acest tip de generare deorece ar trebui
in timp ce iesi cu un pwm pe un pin(Ex P1A) ceilalti pini(P1B, P2C, P1D) pwm
trebuie opriti si semnalul o sa fie un dezastru.
Vezi PIC16F1509 sau PIC16F1847 un fel de hibrid intre 16F si 18F, astea au 4
module PWM si pretul e aceptabil il gasesti la tme.ro

Poti face calcule si cu float (32bit) si la 10 intructiuni/us o operatie de
impartire cu float(cea mai pretentioasa) poate dura vreo 37us, cam
jumatate din (1/13021Hz = 76,8us sample update)
deci mai ramane suficient timp si de alte task-uri ;).

la microX3 codarea fisierelor si salvarea lor in memorie se face in forma
cryptata si doar dupa citirea flash-ului prin SPI sunt decryptate la PCM 8 bit
cu semn, mixate, iar rezultatul incarcat in PWM duty cycle.
Scalarea cu valoarea volum sunet si mixarea se face in intervalul de 76,8us
dintre doua reinprospatari ale duty PWM.
De aceea este suficient la acest tip de decodor sa multiplexeze 4 sunete,
la mai mult de 4 functii activate sunetul o ia in "balarii".
De exemplu la loksound v4 se lauda cu 8 sunete dar si filosofia e alta.
ATmega664PA, arhitectura RISC mai rapida ca si PIC, Quartz 16Mhz si
cam tot atatea intructiuni intr-o us, 6, DAC extern SPI pentru modulare,
frecventa purtatoare PWM, mult mai mare, rezultata din buck-convertorul
folosit pe post de etaj final clasa D si alte ingrediente care lasa spatiu
de procesare pentru CPU si nu il ocupa exagerat. Ups iar am zis prea multe
si ma trezesc cu email de la ESU ca dau din casa ;)

O alta chestie interesanta este modificarea dinamica a pitch-ului sunetului
wav in momentul cand se genereaza sunetul pentru accelerare si decelerare.

Deci,... in incheiere..., in astfel de cazuri se prefera solutii simple,
rapide si cu o eficienta acceptabila cea ce au si facut producatorii de altfel.
Pe schema reprodusa se pot face experimente si cine stie poate se
concretizeaza o platforma deschisa care sa fie utila tuturor.