音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
將PIC單片機(jī)的10位硬件PWM擴(kuò)展到16位以實(shí)現(xiàn)高精度DAC
高精度的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
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
參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
問(wèn)一問(wèn)PIC單片機(jī)B口電平變化中斷的問(wèn)題
我把PIC燒一片IC的燒寫(xiě)器的改造為燒寫(xiě)8片
請(qǐng)問(wèn)這是怎么回事?今天剛買(mǎi)的MPLAB LCD不會(huì)用!請(qǐng)教!
請(qǐng)叫pic高手,懂偉福仿真
關(guān)于16f84a
免費(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)