1. 程式人生 > >CCS5.4+Proteus8的F28027實踐課九、比較器

CCS5.4+Proteus8的F28027實踐課九、比較器

今天寫的不順暢,一個AD寫了八個小時,然後一個溫度感測器又卡了四個小時,哎,沒人能一馬平川,特別是搞技術,我們的目的不是走馬觀花式的學習,而是真正瞭解暫存器的操作,不要怕時間不夠,就怕時間花了還吃不透,反而透露著阿Q精神安慰自己,我們不要這樣。
來來來,直接進入比較器的學習。
比較器圖解
可以提供兩個外部模擬輸入,一個DAC內部基準;輸出可以非同步傳輸,也可以通過限定單元與系統時鐘週期同步,進行簡單濾波;輸出被傳送到ePWM觸發區(Trip Zone)模組和GPIO輸出多路複用器。
比較器大家應該是不陌生的,兩路輸入,當正極輸入大於負極時,輸出高電平;反之輸出低電平,下面是真值表
真值表
每個比較器模組都包含一個10位的DAC電壓基準。電壓輸出大小由DACVAL暫存器或者斜坡發生器控制,這個由第一個比較器的圖解大家就可以瞭解到。
當DACVAL暫存器選擇為DAC的輸入時,輸出大小為
公式


現在來說下斜坡發生器這個,稍微複雜一點
斜坡發生器
在這種模式下,是把RAMPSTS暫存器的前十位當做DAC的輸入
上面看了斜坡發生器的結構圖,下面就是它的控制型號
控制訊號

現在來說比較器的操作了:
初始化
操作大概步驟如下:
1、使能ADC內的帶隙:ADCTRL1.ADCBGPWD=1;
2、使能比較器模組:COMPCTL.RAMPMAXREF=1;
3、使能COMP時鐘:PCLKR3.COMPxENCLK=1;
4、GPIO和AIO引腳複用設定;
5、若用DAC,使能VSSA:ADCTRL1.VREFLOCONV,設定DACVAL.DACVAL,COMP控制暫存器COMPCTL設定:使能、反向輸入源、輸出取反、同步等

現在來看下具體的暫存器,只有幾個,我們耐心看下吧:
首先是控制暫存器
控制暫存器
控制暫存器
然後是狀態暫存器
狀態暫存器
DAC控制暫存器
DAC控制暫存器
DAC控制暫存器
DACVAL暫存器
DACVAL
斜坡發生器相關暫存器
RAMP
RAMP
RAMP
RAMP
RAMP
好了,理論知識講完了,現在來開始寫程式,步驟已經說了,再複述一遍:
1、使能ADC內的帶隙:ADCTRL1.ADCBGPWD=1;
2、使能比較器模組:COMPCTL.COMPDACEN=1;
3、使能COMP時鐘:PCLKR3.COMPxENCLK=1;
4、GPIO和AIO引腳複用設定;
5、若用DAC,使能VSSA:ADCTRL1.VREFLOCONV,設定DACVAL.DACVAL,COMP控制暫存器COMPCTL設定:使能、反向輸入源、輸出取反、同步等

直接寫程式了

   InitComp1Gpio();

   EALLOW;

   SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK=1;
   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
   AdcRegs.ADCCTL1.bit.ADCPWDN = 1;
   AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;

   Comp1Regs.COMPCTL.bit.COMPDACEN=1;
   Comp1Regs.COMPCTL.bit.QUALSEL = 0;
   Comp1Regs.COMPCTL.bit.SYNCSEL = 0;
   Comp1Regs.COMPCTL.bit.COMPSOURCE = 1;
   EDIS;

   while(1);

終於寫完了,好睏,準備洗洗睡了,明天見

早上我用PROTEUS模擬了昨晚的程式,死活不行,妹的,然後直接下載到我的實驗板裡面,把COMP1OUT直接連到一個LED上面,發現程式是正常的,哎,又被模擬軟體搞了一個小時,上面的程式是對的,大家可以使用,不過我那是兩路都是模擬輸入。
效果圖
效果圖

我剛剛又去寫了下DAC控制的模擬輸入方式,也很簡單,直接給大家程式吧,效果圖跟上面是一樣的

   InitComp1Gpio();

   EALLOW;

   SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK=1;
   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
   AdcRegs.ADCCTL1.bit.ADCPWDN = 1;
   AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;
   AdcRegs.ADCCTL1.bit.VREFLOCONV=1;

   Comp1Regs.COMPCTL.bit.COMPDACEN=1;
   Comp1Regs.COMPCTL.bit.QUALSEL = 0;
   Comp1Regs.COMPCTL.bit.SYNCSEL = 0;

   Comp1Regs.COMPCTL.bit.COMPSOURCE = 0;
   Comp1Regs.DACVAL.bit.DACVAL=500;

   EDIS;

   while(1);

菜鳥交流qq群107691092