PIC16F1933應(yīng)用筆記
(1) 按照專業(yè)軟件文件夾9.8版本軟件及使用方法安裝即可。(記得OFF-LINE打勾)
本文引用地址:http://2s4d.com/article/201611/321520.htm
(2)需要在mplab ide中選擇HI-TECH Universal Toolsuite 然后路徑一樣指向picc.exe,這個(gè)時(shí)候編譯的圖標(biāo)將變化為黑色和紅色。
2. 關(guān)于配置位設(shè)置方法:如果是第一次操作的話,建議看著數(shù)據(jù)手冊(cè)進(jìn)行在mplab ide菜單里面進(jìn)行設(shè)置,配置完后,系統(tǒng)會(huì)根據(jù)你配置的,自動(dòng)給出配置位的具體數(shù)據(jù)。記下然后,在程序里面最開始添加這樣兩行:
__CONFIG(0x0FA4);
__CONFIG(0x3AFF);
這樣的好處是新建工程的時(shí)候,將這個(gè)源碼添加進(jìn)去的話,就不用再次設(shè)置了,編譯器會(huì)根據(jù)這兩行程序進(jìn)行自動(dòng)設(shè)置。
3. 關(guān)于16F1933的使用內(nèi)部振蕩的系統(tǒng)時(shí)鐘設(shè)置
除了32MHz的系統(tǒng)時(shí)鐘,都可以按照這樣的步驟:
1)禁用4倍頻(SPLLEN = 0),設(shè)置使用8MHz內(nèi)部振蕩IRCF<3:0>=1110,系統(tǒng)時(shí)鐘選擇位SCS<1:0>=1X或00
2)等待高頻內(nèi)部振蕩器就緒 HFIOFR = 1
3)確定高頻內(nèi)部振蕩器穩(wěn)定 HFIOFS = 1 (精度至少為0.5%)
例程:
OSCCON = 0B01110000; // 8MHz,INTOSC
while(!HFIOFR);
while(!HFIOFS);
4)如果需要設(shè)置32MHz,系統(tǒng)時(shí)鐘選擇為SCS<1:0>=1X,這里不能夠=00;
例程:
OSCCON = 0B11110000; // 32MHz,INTOSC
while(!HFIOFR);
while(!HFIOFS);
4. 在定時(shí)器2,4,6中,有TMRX與PRX有區(qū)別,作用分別是什么?后預(yù)分頻有什么作用?
只使用TMRX的時(shí)候,可以用來裝載一個(gè)初值來計(jì)數(shù),直到溢出。
只使用PRX的時(shí)候,可以裝載一個(gè)具體計(jì)數(shù)到次數(shù),因?yàn)檫@里是當(dāng)TMRX=PRX時(shí),觸發(fā)定時(shí)器X中斷。使用PRX的好處是,可以在中斷中省掉一條重新裝載初值的語(yǔ)句,也就是實(shí)現(xiàn)了所謂的“自動(dòng)重新裝載計(jì)數(shù)器初值”。
后預(yù)分頻的作用為,當(dāng)你定時(shí)進(jìn)入中斷的周期為1ms,而后預(yù)分頻設(shè)置為1/X的話,那么你實(shí)際進(jìn)入中斷的周期變?yōu)榱薠ms。由于定時(shí)器2,4,6不后預(yù)分頻輸出主要應(yīng)用于CCP模塊,它用作CCP模塊在PWM模式下工作時(shí)的時(shí)基。
5. 由于我的應(yīng)用中需要高的pwm分辨率,所以將使用32MHz的系統(tǒng)時(shí)鐘
如果周期相同,是否可以使用相同的定時(shí)器?是否周期不同則需使用不同的定時(shí)器?
如果周期相同,則可以使用同一個(gè)定時(shí)器來產(chǎn)生PWM,周期不同的話必須使用不同的定時(shí)器。
6. 關(guān)于I/O口初始化,初始化不正確的話相應(yīng)的功能不能正常使用。
是否一定要初始化ANSELA,ANSELB,APFCON這些關(guān)于I/O口相關(guān)的寄存器,他們各有什么用?
在關(guān)于備份管腳datasheet中說明有沖突,引腳圖看上面CCP2可以配置到RC1或RB3,但是在具體說明寄存器作用的時(shí)候卻說RC0和RB5,到底哪個(gè)是正確的?
ANSELA,ANSELB不配置對(duì)PWM產(chǎn)生沒有影響,但是建議配置。APFCON一定需要正確配置。
當(dāng)CCP2SEL =0時(shí),PWM在RC1上面產(chǎn)生。
當(dāng)CCP2SEL =1時(shí),PWM在RB3上面產(chǎn)生。
當(dāng)配置增強(qiáng)型PWM時(shí),這個(gè)時(shí)候會(huì)用到P2BSEL,用來選擇P2B輸出管腳,CCP2/P2A可以配置到RC1或RB3,CCP2/P2B可以配置RC0和RB5。
7. 試試占空比兩個(gè)極限值0%,100%的情況
當(dāng)采用PRX=0xFF的時(shí)候,設(shè)置占空比100%會(huì)出現(xiàn)毛刺的情況.因?yàn)檫@個(gè)時(shí)候4*(255+1)=1024=0x400,數(shù)據(jù)已經(jīng)溢出.是不是當(dāng)分辨率達(dá)到10bit的時(shí)候,就不能完全按照占空比100%輸出.
問題?
在使用PIC16F1933的時(shí)候,發(fā)現(xiàn)在采用10bit的PWM輸出占空比為100%的時(shí)候,會(huì)有很多毛刺產(chǎn)生,而不采用10bit的PWM輸出則沒有毛刺。
個(gè)人分析了一下,我是采用定時(shí)器4來作為CCP1輸出PWM的時(shí)基,需要采用10bit的PWM則PR4=0xFF,按照數(shù)據(jù)手冊(cè)上面計(jì)算占空比的公式:100%=(CCPR4L:CCP4CON<5:4>)/(4*(PR4+1))
CCPR4L:CCP4CON<5:4> = 4*(PR4+1) = 4*(0xFF+1)=0x400=0B100 0000 0000
上面的寄存器是12bit的,而后面的計(jì)算結(jié)果為13bit的,是否這個(gè)原因造成輸出占空比100%的10bit PWM而產(chǎn)生很多毛刺,故在實(shí)際項(xiàng)目的時(shí)候如果需要達(dá)到滿占空比的話不能選擇PRX=0xFF,選擇PRX=0xFE。
8. 在調(diào)試串口的時(shí)候發(fā)現(xiàn),當(dāng)上電或者下電的時(shí)候會(huì)出現(xiàn)串口發(fā)送幾個(gè)亂碼的情況,可能是由于復(fù)位端口沒有作為復(fù)位使用的原因,有待驗(yàn)證。
通過實(shí)驗(yàn)表明上電和下電的時(shí)候有可能發(fā)生亂碼的原因是,在上電或者下電的過程中,可能在芯片確認(rèn)上電電壓附近抖動(dòng),造成芯片誤判上電的情況出現(xiàn)而發(fā)生亂碼。在配置位中有個(gè)PWRTE的寄存器,為使能上電延時(shí)定時(shí)器的,將這個(gè)寄存器配置為1,這種情況消失。另出現(xiàn)這個(gè)情況跟復(fù)位端口作為輸入管腳沒有關(guān)系。
9. 需要確認(rèn)一個(gè)100us的函數(shù),在非常短的延時(shí)上面可能用到。
32MHz的情況下 i=255,11.0592MHz的情況下i=89;
Void delay100us(void)
{
Uint8 i = 255;
While(i--);
}
10. 關(guān)于DAC模塊,精度如何?測(cè)試是否能夠輸出外部電壓參考電壓?
經(jīng)過測(cè)試發(fā)現(xiàn)DAC輸出的電壓比理論值會(huì)小0.02V,ADC轉(zhuǎn)換出來的值也會(huì)有同樣的問題,閱讀手冊(cè)發(fā)現(xiàn),固定電壓輸出的精度在±4%左右,由于這個(gè)方案對(duì)電壓精度要求很高,不能夠達(dá)到要求,需使用431作為外部參考。
另可以按照手冊(cè)中的方法查看內(nèi)部參考電壓到底是多少,也就是可以輸出到外部作為參考電壓。
DACEN = 0;
DACLPS = 1; // 選擇DAC正參考電壓源
DACOE = 1; // DACOUT輸出
DACPSS0 = 0; // 選擇FVR作為參考電壓,需設(shè)置FVRCON相應(yīng)位
DACPSS1 = 1;
DACNSS = 0; // vss
DACCON1 = 31;
內(nèi)部參考電壓設(shè)置為4.096時(shí),實(shí)測(cè)值為4.089,這里表現(xiàn)出來精度不準(zhǔn)還不明顯。
當(dāng)我內(nèi)部參考電壓設(shè)置為4.096,DACCON1 = 20,的時(shí)候,本來應(yīng)該輸出2.56V,實(shí)測(cè)2.543V,差了差不多0.02V
評(píng)論