|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
將PIC單片機(jī)的10位硬件PWM擴(kuò)展到16位以實(shí)現(xiàn)高精度DAC |
| 作者:martin 欄目:單片機(jī) |
高精度的DAC技術(shù) 許多嵌入式系統(tǒng)需要穩(wěn)定的模擬電壓輸出來(lái)提供外部增益及失調(diào)電壓或者模擬的電流環(huán)路輸出。PIC嵌入式單片機(jī)系列有很多可以提供10位精度的硬件PWM。盡管這對(duì)很多應(yīng)用是合適的,但還是有一些應(yīng)用需要更高的精度。這個(gè)技術(shù)報(bào)告將討論一個(gè)擴(kuò)展10位精度到16位精度的PWM的技術(shù)。我們還將使用MICROCHIP公司的FILTERLAB 軟件來(lái)設(shè)計(jì)一個(gè)合適的有源低通濾波器來(lái)濾波PWM的脈沖序列以得到一個(gè)穩(wěn)定的模擬電壓。 軟件概述 兩個(gè)寄存器 PWMHIGH 和 PWMLOW 用于指定16位PWM的高電平時(shí)間。10位精度的硬件PWM被初始化為周期128個(gè)指令周期(512個(gè)外部振蕩周期或 9位的精度)。一個(gè)中斷服務(wù)子程序在每次9位精度的硬件PWM周期結(jié)束時(shí)執(zhí)行(128個(gè)指令周期)。這個(gè)中斷服務(wù)子程序負(fù)責(zé)根據(jù)另外的7位(128次計(jì)數(shù))來(lái)設(shè)置硬件PWM的高電平時(shí)間值為FF或00。 因?yàn)镻WM的控制高電平時(shí)間的寄存器是雙緩沖器的,所以這個(gè)這個(gè)中斷只要在128個(gè)指令周期的PWM的周期內(nèi)完成就不會(huì)產(chǎn)生輸出的毛刺。PWM的高電平時(shí)間會(huì)在下一個(gè)PWM周期得到更新。 ------------------/ /----------------------- | | | --------------------- HHHHHHHHHHHHHHHHHH/ /HHHHHHHHHHHHHHHHHHHHHHTLLLLLLLLLLLLLLLLLLLR |<----------------/ /---- 總計(jì) 128 個(gè) PWM 周期 -------------->| 總計(jì) # 硬件PWM周期在一個(gè) 16位 PWM 輸出 = 總計(jì) H, L, T 周期數(shù) = 2^(16-9) = 128 H - PWM高電平,硬件PWM設(shè)置為100% L - PWM低電平,硬件PWM 設(shè)置為 0% T - PWM 高 -> 低 轉(zhuǎn)換周期,硬件PWM設(shè)置為PWM<8:0> R - PWM 低 -> 高 轉(zhuǎn)換周期,硬件PWM設(shè)置為100% 下面的程序包含在這個(gè)例子中: 中斷 - 該中斷服務(wù)程序每128個(gè)指令周期進(jìn)入一次,中斷由每個(gè)PWM周期結(jié)束產(chǎn)生。中斷里消耗的時(shí)間計(jì)算如下: 中斷服務(wù)程序任務(wù) 所花指令周期數(shù) 中斷服務(wù)進(jìn)入點(diǎn)延遲 3 中斷現(xiàn)場(chǎng)保存 4 軟件處理PWM子程序 27 (花時(shí)間最長(zhǎng)的流程) 中斷現(xiàn)場(chǎng)恢復(fù) 4 中斷返回 2 -------------------------------------------------------- 總計(jì)中斷服務(wù)時(shí)間 40 CPU占用率 40/128 = 31% 因?yàn)镻WM維護(hù)的代碼總共只花了40個(gè)指令周期(最壞的情況),其他的中斷服務(wù)處理可以加進(jìn)中斷服務(wù)程序只要它花的指令周期數(shù)小于128。 主程序 - 主程序首先初始化PWM模塊,并且設(shè)置TMR2周期值并使能TMR2周期中斷。作為一個(gè)測(cè)試手段,RB0的按鍵被掃描,并在每次按下后把16位的高電平周期值寄存器 (PWMHIGH:PWMLOW)加一。 使用者的代碼只需要簡(jiǎn)單地往PWMHIGH 和 PWMLOW 寄存器里裝載一個(gè)合適的10位的值。在更新PWMHIGH 和 PWMLOW寄存器值時(shí)中斷被關(guān)掉以確保PWM在新周期裝入新值而不產(chǎn)生毛刺。 輸出濾波 - 因?yàn)镻WM輸出需要被濾波來(lái)產(chǎn)生一個(gè)直流的模擬電壓,我們需要在PIC單片機(jī)的PWM輸出通道上加一個(gè)有源低通濾波器。MICROCHIP公司的FilterGen軟件( 可以從網(wǎng)站下載 www.microchip.com )被用來(lái)設(shè)計(jì)一個(gè)有源低通濾波器,使用MCP602雙運(yùn)放。 假設(shè)PIC單片機(jī)運(yùn)行在20MHZ,那么16位的PWM將運(yùn)行在: 20,000,000 / 2^16 = 303.175 Hz = 3.2738 Ms. 首先我們要轉(zhuǎn)換達(dá)到16位的DB數(shù) DB = 20 log (VALUE) = 20 * log (2 ^ 16) = 96 dB 開(kāi)始一個(gè)4階低通濾波器的設(shè)計(jì) (24 dB / octive),我們想要的主頻率 303 Hz要多余96DB的跌落。 96 dB / 24 db/octive = 4 octives Fc = 303/(2^4) = 19 Hz 保守起見(jiàn),我們選擇Fc 為10 Hz, 20 Hz取樣,16位精度(96 dB),然后FilterGen設(shè)計(jì)出如下電路: ![]() 這個(gè)電路有如下的帶寬 ![]() 結(jié)論 高精度的數(shù)字到模擬轉(zhuǎn)換可以使用有源低通濾波器結(jié)合PIC單片機(jī)擴(kuò)充精度的硬件PWM來(lái)實(shí)現(xiàn)。我們可以從PIC單片機(jī)的PWM高電平時(shí)間寄存器雙緩沖的結(jié)構(gòu)獲益,并且輕松地?cái)U(kuò)充10位精度到16位或者更多。 |
| 2樓: | >>參與討論 |
| 作者: martin 于 2003/8/20 14:02:00 發(fā)布:
16位PWM測(cè)試程序 #include P16F877.inc __CONFIG _XT_OSC&_WDT_OFF&_PWRTE_ON&_CP_OFF ERRORLEVEL -302 ; Shut off banking error messages CBLOCK 0x20 ; Define general variables here PWMHIGH ; Upper byte of desired PWM high duty cycle PWMLOW ; Lower byte of desired PWM low duty cycle PWMHICNT ; Internal SOFTWARE PWM high time counter PWMCNT ; Internal SOFTWARE PWM period time counter PWMHIGHSTORE ; Internal SOFTWARE PWM high time VALUE (shadow register) PWMLOCNT ; Internal SOFTWARE PWM low time VALUE (shadow register) TEMP ; Internal TEMP register for SOFTWARE PWM SAVEW ; Temporary ISR storage location for W SAVESTATUS ; Temporary ISR storage location for STATUS DELAY ; Delay counter for main TEST program (Example ONLY - not needed for PWM operation) ENDC NUMPWMBITS EQU .16 ; 16-bit PWM implementation INITCOUNT EQU .128 ; Need 7 extra bits -> 2^7 = 128 org 0 NOP ; NOP added for SUPPORT of MPLAB-ICD - can be eiliminated for EMULATOR or normal DEVICE operation goto start ; Jump to start of main program org 4 ; ************************************************************************* ; * ISR is entered every 128 cycles at end of each * ; * HARDWARE PWM period. SOFTWARE extension DC * ; * period and PWM H->L time are updated here * ; * -------------------------------------------- * ; * | | | * ; * --------------------- * ; * HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHTLLLLLLLLLLLLLLLLLLLR * ; * |<----------------------- Total 128 PWM periods -------------->| ; * * ; * Total period (sum of H, L, T cycles = 2^(16-9) = 128 * ; * H is PWM high cycle, HW PWM set to 100% DC * ; * L is PWM low cycle, HW PWM set to 0% DC * ; * T is PWM high -> low transition cycle, HW PWM set to PWM<8:0> * ; * R is PWM low -> high transition cycle, HW PWM set to 100%, * ; * PWM cycle counts are reset * ; ************************************************************************* interrupt movwf SAVEW ; Save W register for later restoration at end of ISR swapf STATUS,W ; Save STATUS register in W clrf STATUS ; Point to bank 0 movwf SAVESTATUS ; Save STATUS register for later restoration at end of ISR bcf PIR1,TMR2IF ; Clear TMR2 overflow interrupt decfsz PWMHICNT,F ; Subtract 1 from upper 6-bit high counter goto check_pwm_high ; This is NOT high to low time, jump to check high time high_low_time swapf PWMLOCNT,W ; Place (2) LSBs into positions 5,6 andlw b'00110000' ; Mask out all but CCP1X,Y bits iorlw b'00001100' ; Set PWM ON setup VALUE into W movwf CCP1CON ; Update CCP1X,Y bits, PWM on rrf PWMHIGHSTORE,W ; Update carry bit with bit 6 of PWM high time rrf PWMLOCNT,F ; Shift bit 6 into PWMLOCNT MSB rrf PWMLOCNT,W &nbs |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |