??在使用STM8單片機的ADC功能時,讀取ADC數(shù)據(jù)時一般有兩種方式,一種是通常不斷地讀取采樣標(biāo)志位,來判斷ADC采樣是否結(jié)束,一種是通過中斷的方式來通知系統(tǒng)采樣是否結(jié)束。
??有時候采樣ADC數(shù)據(jù)的時候,需要按照一定的時間間隔,定點的去采樣數(shù)據(jù)。一般使用的方式就是通過定時器定時,然后在定時中斷函數(shù)中再去讀取ADC采樣的數(shù)據(jù)。但是這種方式采樣的時間是不固定的,比如進(jìn)入定時器中斷后,ADC采樣剛結(jié)束,就可以直接使用當(dāng)前采樣到的數(shù)據(jù)。但是如果運氣不好的話,進(jìn)入定時中斷后,ADC采樣剛開始,那么此時就需要等到ADC采樣結(jié)束后,才能使用數(shù)據(jù)。這樣就好導(dǎo)致每次讀取ADC數(shù)據(jù)時還會有隨機的一段等到ADC數(shù)據(jù)的延時。
??通常查閱STM8單片機的手冊發(fā)現(xiàn),ADC采樣可以通過定時器來觸發(fā)。
??通過定時器來觸發(fā)ADC采樣時,定時器的定時時間是固定的,采樣時間也是固定的,這樣采樣數(shù)據(jù)的間隔也就是固定的。這樣通過定時器來觸發(fā)ADC的采樣時間,就能完全保證每次讀取ADC采樣數(shù)據(jù)的時間間隔都是一樣的,從而避免了數(shù)據(jù)的誤差。
??數(shù)據(jù)手冊中對于開啟ADC觸發(fā)功能描述如下:
??對于如何通過代碼來設(shè)置ADC觸發(fā),官方也沒有詳細(xì)的說明,在網(wǎng)上也沒有找到相關(guān)例程。所以只能自己摸索,還好通過自己的一番摸索,成功的通過定時器的TRGO事件觸發(fā)了ADC的啟動。
??關(guān)于ADC相關(guān)寄存器的設(shè)置,基本就是上面說的6條。接下來需要設(shè)置的就是定時器的相關(guān)寄存器。
??關(guān)于定時器只需要設(shè)置CR2寄存器中的 MMS位就可以了。
??接下來就通過代碼來實現(xiàn)。
#include "adc.h"
#include "main.h"
#include "led.h"
u16 DATAH = 0; //ADC轉(zhuǎn)換值高8位
u16 DATAL = 0; //ADC轉(zhuǎn)換值低8位
_Bool ADC_flag = 0; //ADC轉(zhuǎn)換成功標(biāo)志
u16 adc_cnt = 0;
//AD通道引腳初始化
void ADC_GPIO_Init( void )
{
PD_DDR &= ~( 1 << 2 ); //PD2 設(shè)置為輸入
PD_CR1 &= ~( 1 << 2 ); //PD2 設(shè)置為懸空輸入
PD_DDR &= ~( 1 << 3 ); //PD3 設(shè)置為輸入
PD_CR1 &= ~( 1 << 3 ); //PD3 設(shè)置為懸空輸入
}
//ch 為單片機的ADC 通道
//ADC輸入通道初始化入口參數(shù)表示通道選擇
void ADC_CH_Init( u8 ch )
{
char l = 0;
ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 單次轉(zhuǎn)換,禁止轉(zhuǎn)換
ADC_CR2 = 0x00; //默認(rèn)左對齊 讀數(shù)據(jù)時先讀高在讀低
ADC_CR2 |= ( 1 << 6 ); //外部觸發(fā)使能
ADC_CSR |= ch; //控制狀態(tài)寄存器 選擇要 AD輸入通道 如:PD2(AIN3)
ADC_TDRL = ( 1 << ch ); //禁止相應(yīng)通道 施密特觸發(fā)功能 1左移ch位
ADC_CR1 |= 0x01; //使能ADC并開始轉(zhuǎn)換
ADC_CSR |= ( 1 << 5 ); //EOCIE 使能轉(zhuǎn)換結(jié)束中斷 EOC中斷使能
for( l = 0; l < 100; l++ ); //延時,保證ADC模塊的上電完成 至少7us
ADC_CR1 = ADC_CR1 | 0x01; //再次將CR1寄存器的最低位置1 使能ADC 并開始轉(zhuǎn)換
}
u16 value = 0;
//AD中斷服務(wù)函數(shù) 中斷號22
#pragma vector = 24 // IAR中的中斷號,要在STVD中的中斷號上加2
__interrupt void ADC_Handle( void )
{
ADC_CSR &= ~0x80; // 轉(zhuǎn)換結(jié)束標(biāo)志位清零 EOC
//默認(rèn)左對齊 讀數(shù)據(jù)時先讀高高8位 再讀低8位
DATAH = ADC_DRH; // 讀出ADC結(jié)果的高8位
DATAL = ADC_DRL; // 讀出ADC結(jié)果的低8位
ADC_flag = 1; // ADC中斷標(biāo)志 置1
value = ( DATAH << 2 ) + DATAL ; //得到十位精度的數(shù)據(jù) 0--1024
adc_cnt++;
LED = !LED;
}
??在ADC代碼中,相比普通的ADC初始化方式,這里只需要增加一句對ADC_CR2寄存器的設(shè)置。
ADC_CR2 |= ( 1 << 6 ); //外部觸發(fā)使能
??在ADC_CR2寄存器中 使能外部觸發(fā)轉(zhuǎn)換功能,設(shè)置外部觸發(fā)事件為 內(nèi)部定時器1 TRG事件。
??這里ADC使用的是單次觸發(fā)模式,開啟外部觸發(fā)功能,開啟ADC轉(zhuǎn)換中斷,當(dāng)ADC轉(zhuǎn)換完成之后,就會進(jìn)入到ADC中斷中,在中斷中讀取采樣的數(shù)據(jù),然后翻轉(zhuǎn)LED的狀態(tài),通過示波器觀察LED引腳電平的變化,就可以知道ADC中斷進(jìn)入的頻率了。
??接下來編寫定時器初始化代碼。
unsigned long time_cnt = 0;
// 使用 定時器觸發(fā) ADC采樣
void tim1_init( void )
{
TIM1_ARRH = ( unsigned char )( 1000 >> 8 ); //定時1ms
TIM1_ARRL = ( unsigned char )( 1000 );
TIM1_PSCRH = ( unsigned char )( 0x0F >> 8 ); // 16M / (1+15) =1M
TIM1_PSCRL = ( unsigned char )( 0x0F );
TIM1_RCR = 0x00; //重復(fù)計數(shù)器值
TIM1_SR1 = ( ~0x01 ); //清除更新中斷標(biāo)志
TIM1_CR2 |= ( 2 << 4 ); //使能信號,用于觸發(fā)輸出(TRGO)
TIM1_CR1 |= 0x01; //使能計數(shù)器
TIM1_IER |= 0x01; //更新中斷使能
}
#pragma vector = 13 //IAR中的中斷號,要在STVD中的中斷號上加2
__interrupt void Timer1_Handle( void ) //1ms 定時中斷
{
TIM1_SR1 = ( ~0x01 ); //清除更新中斷標(biāo)志
time_cnt++;
}
??定時器的初始化代碼,也比正常情況下初始化代碼多了一行。
TIM1_CR2 |= ( 2 << 4 ); //使能信號,用于觸發(fā)輸出(TRGO)
??用來開啟定時的的TRG功能。
??經(jīng)過測試,這里定時器CR2寄存器中的值 只能設(shè)置為 010 或者 011,設(shè)置為其他值時,不能觸發(fā)ADC采樣。最開始測試的時候按照芯片資料上這個說明,MMS的值設(shè)置的是 001,ADC總是觸發(fā)不了,還以為是方法的問題,最后才發(fā)現(xiàn)是MMS值設(shè)置的問題。
??ADC和定時器初始化代碼設(shè)置完成之后,接下來在主函數(shù)中初始化這兩個函數(shù)就行了,按照資料上說的,首先初始化完ADC之后,再初始化定時器。
void main( void )
{
__asm( "sim" ); //禁止中斷
SysClkInit();
delay_init( 16 );
LED_GPIO_Init();
ADC_GPIO_Init();
ADC_CH_Init(3);
tim1_init();
__asm( "rim" ); //開啟中斷
while( 1 )
{
}
}
??接下來運行程序。
??分別在ADC中斷中和定時器中斷中用一個變量來統(tǒng)計中斷執(zhí)行的次數(shù),通過變量變量觀察窗口可以看到,ADC中斷的次數(shù)比定時器中斷的次數(shù)多了1次。這是因為ADC在初始化的時候,已經(jīng)運行了一次。
??然后通過示波器觀察LED口的電平。
??定時器的定時時間是1ms,LED的高低電平時間也是1ms,說明通過定時器觸發(fā)ADC采樣功能是正常運行的。
??為了減小系統(tǒng)進(jìn)入中斷的次數(shù),可以將定時器的中斷功能關(guān)閉掉。定時器中斷功能關(guān)閉后,ADC的觸發(fā)功能依然可以正常使用。
??這樣只需要開啟一個ADC中斷,再加上定時器的TRG觸發(fā)功能后,就可以實現(xiàn)ADC定時采樣的功能了。
上一篇:STM8單片機通過PWM觸發(fā)ADC同步采樣
下一篇:單片機快速將庫函數(shù)版代碼移植為寄存器代碼方法
推薦閱讀
史海拾趣
進(jìn)入21世紀(jì)后,F(xiàn)ILTRONETICS意識到全球化市場的重要性,開始積極開拓國際市場。公司加強了與國際客戶的溝通與合作,參加了多個國際電子展會,展示了公司的技術(shù)和產(chǎn)品。同時,公司還在海外設(shè)立了分支機構(gòu),以便更好地服務(wù)當(dāng)?shù)乜蛻簟Mㄟ^不懈的努力,F(xiàn)ILTRONETICS成功打入多個國際市場,并贏得了眾多國際客戶的信賴和支持。
為了確保產(chǎn)品質(zhì)量,F(xiàn)ILTRONETICS始終將質(zhì)量管理放在首位。公司建立了完善的質(zhì)量管理體系,從原材料采購、生產(chǎn)制造到產(chǎn)品檢測、售后服務(wù)等各個環(huán)節(jié)都嚴(yán)格把關(guān)。同時,公司還引入了先進(jìn)的檢測設(shè)備和技術(shù)手段,對產(chǎn)品進(jìn)行全方位的質(zhì)量檢測和控制。這些措施不僅確保了產(chǎn)品的穩(wěn)定性和可靠性,也提升了公司的品牌形象和市場聲譽。
進(jìn)入20世紀(jì)30年代,Hammond迎來了其發(fā)展歷程中的一個重要轉(zhuǎn)折點。在1930年代初,Hammond成為加拿大第一家生產(chǎn)兩柱式機架和窄柜系列產(chǎn)品的公司,這些產(chǎn)品迅速獲得了廣播和通訊行業(yè)的青睞。這一創(chuàng)舉不僅鞏固了Hammond在業(yè)內(nèi)的地位,還為其后續(xù)在電氣、電子行業(yè)的全面發(fā)展鋪平了道路。
進(jìn)入21世紀(jì)后,Hammond進(jìn)行了內(nèi)部重組,將變壓器事業(yè)部分拆為獨立的Hammond Power Solutions, Inc.(HPSI)。這一舉措使得兩家公司能夠更加專注于各自的核心業(yè)務(wù),實現(xiàn)更加高效和專業(yè)化的發(fā)展。Hammond Manufacturing則繼續(xù)專注于電氣和電子外殼、機架、機柜以及電子變壓器的生產(chǎn),而HPSI則專注于定制和分類變壓器的制造。這種專業(yè)化的分工不僅增強了各自的市場競爭力,還為客戶提供了更加全面和專業(yè)的服務(wù)。
通過這些故事,我們可以看到Hammond公司在電子行業(yè)中的發(fā)展歷程充滿了挑戰(zhàn)與機遇。從初創(chuàng)時期的艱難起步,到成為行業(yè)先驅(qū)和全球領(lǐng)先企業(yè),Hammond始終保持著對市場的敏銳洞察和持續(xù)創(chuàng)新的精神。
進(jìn)入20世紀(jì)30年代,Hammond迎來了其發(fā)展歷程中的一個重要轉(zhuǎn)折點。在1930年代初,Hammond成為加拿大第一家生產(chǎn)兩柱式機架和窄柜系列產(chǎn)品的公司,這些產(chǎn)品迅速獲得了廣播和通訊行業(yè)的青睞。這一創(chuàng)舉不僅鞏固了Hammond在業(yè)內(nèi)的地位,還為其后續(xù)在電氣、電子行業(yè)的全面發(fā)展鋪平了道路。
純C語言的程序,為什么使用 SHLoadImageFile 函數(shù)編譯后執(zhí)行就提示“不是有效的 Windows CE 應(yīng)用程序”? 我的WinCE程序是純 C 語言的Win32的程序(源文件的擴展名都是.c的),不使用 SHLoadImageFile 函數(shù),程序能執(zhí)行。為什么使用 SHLoadImageFile 函數(shù)編譯后執(zhí)行就提示“不是有效的 Windows CE 應(yīng)用程序”?… 查看全部問答∨ |
串口助手發(fā)送數(shù)據(jù)通過單片機控制l ed屏顯示? 目的是 用vb通過單片機控制led屏。現(xiàn)在先用串口助手試下。我想用串口助手先發(fā)一個數(shù)過去,點亮led屏的一個小燈,在依次累加。led屏是用74hc595串起來的。其間也想把單片機接收的數(shù)據(jù)回顯到串口助手來證明接受無誤。以前直接燒程序控制屏?xí)r點亮第一 ...… 查看全部問答∨ |
關(guān)于用LM3S811做一個接觸式IC讀卡器的問題 是這樣的本人剛剛接觸這個新型的單片機有很多不理解的地方,就是我想問一下我要用這個新型的單片機要如何做出一個接觸式IC卡讀卡器來。汗顏一個,我對于這個單片機的引腳不怎么清楚?麻煩各位有時間的可以給說一下嗎?… 查看全部問答∨ |
############################## #功能:監(jiān)控指定的進(jìn)程是否正常運行,如果運行則休眠,過一段時間再檢測一下, # 如果監(jiān)控的進(jìn)程沒有運行,則啟動該程序 ########################### ...… 查看全部問答∨ |
請問各位大蝦,我需要用到SDram和SSI1,可以復(fù)用嗎? 如題,因為SDRAM的信號線和SSI1的被復(fù)用了,不知道能不能在啟用SDRAM的時候啟用SSI1,如下圖所示: 比如,把CLK啟用在PF2,把TX啟用在PH7這種。謝謝!而不是把所有信號線啟用在同一個端口,比如PortE… 查看全部問答∨ |
|
用XST綜合工具check syntax工程時,提示如下錯誤 ERROR:HDLParsers:3375 - "D:/FPGA_code/p240_fir2/p240_fir2.vhd" Line 66. Choices for an array aggregate (Attribute name) must be locally static unless there is only one choice. (LRM 7.3.2.2)代碼如下:library IEEE;use IEEE.STD_LOGIC ...… 查看全部問答∨ |
EEWORLD下載中心鼎力奉獻(xiàn)“寫給大家看的C語言書”,讓你輕松玩轉(zhuǎn)C語言 EEWORLD下載中心鼎力奉獻(xiàn)“寫給大家看的C語言書”,讓你輕松玩轉(zhuǎn)C語言 EEWORLD下載中心正式上線一年多了,現(xiàn)在資源數(shù)量已經(jīng)超過50萬,這與廣大網(wǎng)友的關(guān)注和努力是分不開的。 對于一個資源中心來書,10萬的資源數(shù)量已經(jīng)囊括了日常所用資源的絕大部 ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實惠套件和強大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- 強強聯(lián)合再進(jìn)階!理想AD Pro輔助駕駛正式升級搭載地平線征程6M
- 英特爾與黑芝麻智能簽署合作備忘錄,聯(lián)合發(fā)布艙駕融合平臺
- 英特爾與面壁智能宣布建立戰(zhàn)略合作伙伴關(guān)系,共同研發(fā)端側(cè)原生智能座艙
- 芯馳科技發(fā)布X10,打造全民AI時代座艙處理器新標(biāo)桿
- 精準(zhǔn)適配,輕裝全能!芯馳發(fā)布E3系列高端智控MCU三大應(yīng)用場景
- 場景定義、精準(zhǔn)創(chuàng)「芯」,芯馳全新發(fā)布AI座艙處理器和高端智控系列
- Arm 技術(shù)加持,地平線以 HSD 及征程 6P 推動汽車智能化變革
- 華為自動駕駛技術(shù)解讀
- 加速電動化轉(zhuǎn)型,邦迪汽車系統(tǒng)攜多款創(chuàng)新產(chǎn)品首秀2025上海車展
- 數(shù)據(jù)中心面臨電力約束挑戰(zhàn),推動GenAI終端發(fā)展
- ADI有獎下載活動之23:ADI民用無人機解決方案
- 【XILINX 主題分享月】 信號處理資料大搜集!!!
- TTI&TE直播:傳感器在工業(yè)電機里的發(fā)展及最新應(yīng)用
- 免費申請|兆易創(chuàng)新GD32L233嘗鮮體驗,開啟節(jié)能“芯”時代!
- VISHAY醫(yī)療主題月 幸運闖關(guān)贏大獎!
- 邀您共赴一場技術(shù)盛宴! 2022英特爾® FPGA中國技術(shù)周 ——加速,讓創(chuàng)新有跡可循
- ADI有獎下載活動之13升級版ADI電機控制解決方案—伺服控制
- TI工業(yè)月技術(shù)方案深度學(xué)習(xí)
- ublox無線開發(fā)板EVK-NINA-B400免費申請
- 【NI有獎直播】當(dāng)DeepSeek遇到LabVIEW【進(jìn)入直播頁面,掃碼看回放】