日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

S32K系列之ADC

發(fā)布時(shí)間:2023/12/14 编程问答 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 S32K系列之ADC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介

在S32K中,不同的芯片型號(hào)支持的ADC通道不同,S32K144UAVLL有兩個(gè)ADC,每個(gè)ADC有12位、10位、8位和6位可選,每個(gè)ADC有16個(gè)外部通道。學(xué)習(xí)ADC的第一步是要掌握ADC的功能框圖,對(duì)ADC的工作過程和編程過程有個(gè)整體的了解。

ADC功能框圖

對(duì)ADC的配置主要涉及三種寄存器,控制狀態(tài)寄存器、觸發(fā)寄存器和數(shù)據(jù)寄存器。控制狀態(tài)寄存器主要有SC2、SC3、CFG1和CFG2;觸發(fā)寄存器主要有SC1和SC2;數(shù)據(jù)寄存器主要有Rn。

電壓輸入范圍

ADC的輸入電壓范圍為:VREFL≤VIN≤VREFHV_{REFL}≤V_{IN}≤V_{REFH}VREFL?VIN?VREFH?,ADC的輸入范圍取決于4個(gè)參考電源VREFL、VREFH、VDDA、VSSAV_{REFL}、V_{REFH}、V_{DDA}、V_{SSA}VREFL?、VREFH?、VDDA?VSSA?

?ADC的電壓輸入范圍取決于4個(gè)參考電源?,我們?cè)谠O(shè)計(jì)原理圖的時(shí)候一般把?VREFLV_{REFL}VREFL??VSSA?V_{SSA}?VSSA? 接地,把?VREFHV_{REFH}VREFH??VDDA?V_{DDA}?VDDA? 接3.3V,可以得到ADC的輸入范圍是0~3.3V。在設(shè)計(jì)原理圖時(shí),應(yīng)該把ADC設(shè)置為可以配置成外用輸入電壓參考源,以備不時(shí)之需,如下圖所示。

如上圖所示,?有三個(gè)選項(xiàng)。

  • 焊接上R103,拆掉R99,R109和D7,電壓參考源為VDD_MCU,一般為3.3V
  • 焊接上D7和R99,拆掉R103和R109,R99進(jìn)行分壓之后為3V
  • 焊接上R109,拆掉R103,R99和D7。這里的?是外部輸入電壓引腳,可以配置為外部電壓參考源
  • 時(shí)鐘配置

    可以選擇4個(gè)時(shí)鐘源ALTCLKx之一來作為ADC模塊的時(shí)鐘源。ADC具有多個(gè)時(shí)鐘源。 選擇取決于配置PCC_ADCn[PCS]。 分頻器的配置應(yīng)使ADC轉(zhuǎn)換時(shí)鐘頻率在ADC要求的有效范圍內(nèi)(請(qǐng)參見數(shù)據(jù)手冊(cè))。如下圖所示為ADC的時(shí)鐘分配圖。

    如圖所示,ADC的時(shí)鐘源輸入通過PCC_ADCn[PCS]來選擇SOSCDIV2_CLK、SIRCDIV2_CLK、FIRCDIV2_CLK和SPLLDIV2_CLK四種,然后經(jīng)過ADC_CFG1[ADIV]來時(shí)鐘分頻,最后產(chǎn)生ADC的輸入時(shí)鐘ADCK,ADCK由數(shù)據(jù)手冊(cè)可得,最大50MHZ,最小2MHZ,典型值為40MHZ,如果超過最大頻率,ADC的轉(zhuǎn)換結(jié)果會(huì)變得不可靠。ADC時(shí)鐘設(shè)置流程如下:

  • 設(shè)置PCC_ADCn[PCS]:選擇時(shí)鐘源
  • 設(shè)置ADC_CFG1[ADICLK]:選擇時(shí)鐘輸入
  • 設(shè)置ADC_CFG1[ADIV]:選擇時(shí)鐘分頻
  • 轉(zhuǎn)換時(shí)間

    數(shù)據(jù)手冊(cè)顯示,ADC的轉(zhuǎn)換時(shí)間取決于:

    • ADC_CFG2[SAMPLTS]確定的采樣時(shí)間
    • MCU的Bus總線時(shí)鐘頻率
    • ADC_CFG1[MODE]確定的轉(zhuǎn)換模式
    • fADCKf_{ADCK}fADCK?即ADC的轉(zhuǎn)換時(shí)鐘頻率

    由數(shù)據(jù)手冊(cè)可得,ADC的總轉(zhuǎn)換時(shí)間=采樣相位時(shí)間(SMPLTS設(shè)置的再+1)+保持相位(1個(gè)ADC周期)+比較相位時(shí)間(8位模式=20個(gè)ADC周期,10位模式=24個(gè)ADC周期,12位模式=28個(gè)ADC周期)+單個(gè)或第一個(gè)連續(xù)時(shí)間加法器(5個(gè)ADC周期+5個(gè)總線時(shí)鐘周期)

    例:設(shè)置BUS時(shí)鐘為40MHZ,ADC時(shí)鐘選擇40MHZ,12位ADC,采樣周期選擇255個(gè)ADC周期,計(jì)算ADC的一次轉(zhuǎn)換時(shí)間為:
    Tconv=255+1+1+28+54×106+54×106=73.75μsT_{conv}=\frac{255+1+1+28+5}{4×10^6 }+\frac{5}{4×10^6}=73.75μsTconv?=4×106255+1+1+28+5?+4×1065?=73.75μs

    觸發(fā)設(shè)置


    ADC觸發(fā)設(shè)置主要包括寄存器SC2和SC1。ADC支持軟件觸發(fā)和硬件觸發(fā)兩種,軟件觸發(fā)就是在ADC轉(zhuǎn)換完畢之后產(chǎn)生中斷;在硬件觸發(fā)方面,ADC模塊具有可選的異步硬件轉(zhuǎn)換觸發(fā)器ADHWT,主要通過PDB來觸發(fā)。觸發(fā)設(shè)置可見PDB觸發(fā)ADC。設(shè)置ADC_SC2[ADTRG]來選擇是硬件觸發(fā)還是軟件觸發(fā)。觸發(fā)方式的設(shè)置流程如下:

  • 設(shè)置ADC_SC2[ADTRG]:選擇觸發(fā)方式
  • 設(shè)置ADC_SC1n[ADCH]:選擇ADC通道
  • 如果上一步使用了具有硬件交錯(cuò)功能的通道,則需要設(shè)置SIM_CHIPCTL[ADC_INTERLEAVE_EN]位
  • 設(shè)置ADC_SC1n[AIEN]:開啟中斷觸發(fā)(軟件觸發(fā)模式下)
  • 獲得ADC數(shù)據(jù)

    最后轉(zhuǎn)換成功后,ADC的轉(zhuǎn)換結(jié)果會(huì)被存放在ADC_Rn寄存器,ADC_Rn寄存器對(duì)應(yīng)的是ADC_SC1n寄存器,比如ADC_SC1A的數(shù)據(jù)會(huì)存放在ADC_RA,ADC_SC1B的數(shù)據(jù)會(huì)存放在ADC_RB,以此類推。

    在不同的轉(zhuǎn)換位數(shù)下,ADC_Rn寄存器的數(shù)據(jù)位數(shù)也不同,如下圖所示。

    注:ADC_Rn寄存器是只讀的

    電壓轉(zhuǎn)換

    模擬電壓經(jīng)過ADC轉(zhuǎn)換后,是一個(gè)相對(duì)精度的數(shù)字值,如果通過串口以16進(jìn)制打印出來的話,可讀性比較差,故需要把數(shù)字電壓轉(zhuǎn)換為模擬電壓,也可以根據(jù)實(shí)際的模擬電壓(用萬用表測(cè))對(duì)比,看看轉(zhuǎn)換是否準(zhǔn)確。

    在設(shè)計(jì)原理圖時(shí),一般會(huì)把ADC的輸入電壓范圍定在0~3.3V,若設(shè)置的ADC為12位,那么12位滿量程對(duì)應(yīng)的就是3.3V,12位滿量程對(duì)應(yīng)的數(shù)字值是:2122^{12}212 。數(shù)值0對(duì)應(yīng)的就是0V。如果轉(zhuǎn)換后的數(shù)值為X,X對(duì)應(yīng)的模擬電壓為Y,那么:
    2123.3=XY→Y=3.3×X212\frac{2^{12}}{3.3}=\frac{X}{Y} → Y=\frac{3.3\times X}{2^{12}}3.3212?=YX?Y=2123.3×X?

    實(shí)例:ADC觸發(fā)中斷

    功能概述

    • 平臺(tái):S32K144

    現(xiàn)在使用S32K144的ADC0通道8,軟件觸發(fā)模式下,轉(zhuǎn)換結(jié)束后觸發(fā)中斷。

    編程順序

  • 初始化ADC0的時(shí)鐘
  • 初始化ADC0的位數(shù)
  • 選擇ADC0的通道,開啟中斷
    • 如果該通道有硬件交錯(cuò)功能,需要選擇是哪個(gè)ADC通道
  • 選擇軟件觸發(fā)
  • NVIC開啟ADC中斷
  • // ADC初始化函數(shù) void ADC0_Init(void) {PCC->PCCn[PCC_PORTA_INDEX] |= PCC_PCCn_CGC_MASK; /* Enable clock for PORTA */SIM->CHIPCTL |= (1 << 2); /* 具有硬件交錯(cuò)功能,選擇PTB13 */PCC->PCCn[PCC_ADC0_INDEX] &= ~PCC_PCCn_CGC_MASK; PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_PCS(6); /* PCS=6: 選擇內(nèi)核時(shí)鐘80MHZ */PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_CGC_MASK; ADC0->CFG1 = ADC_CFG1_ADIV(2) | /* ADIV=2:輸入內(nèi)核時(shí)鐘兩分頻=40MHZ */ADC_CFG1_MODE(1) | /* MODE=1: 12位ADC */ADC_CFG1_ADICLK(0); /* ADICLK=0: 默認(rèn)選擇PCC分配的時(shí)鐘 */ADC0->SC1[0] = ADC_SC1_AIEN_MASK | /* AIEN=1: 開啟中斷觸發(fā) */ADC_SC1_ADCH(8); /* ADCH=8: 序號(hào)0選擇通道8 */ADC0->SC2 |= ADC_SC2_ADTRG(0); /* ADTRG=0: 開啟軟件觸發(fā) */ADC0->SC3 = 0; S32_NVIC->ICPR[1] = 1 << (39 % 32); /* 注冊(cè)ADC0中斷 */S32_NVIC->ISER[1] = 1 << (39 % 32); /* 使能ADC0中斷 */S32_NVIC->IP[39] = 0xA0; /* 優(yōu)先級(jí)為10 */ } /** \brief adcChan通道開啟一次ADC轉(zhuǎn)換** \param adcChan 需要進(jìn)行ADC轉(zhuǎn)換的通道**/ void convertAdcChan(uint16_t adcChan) { ADC0->SC1[0] &= ~ADC_SC1_ADCH_MASK; /* Clear prior ADCH bits */ADC0->SC1[0] = ADC_SC1_ADCH(adcChan); /* Initiate Conversion*/ }/** \brief ADC轉(zhuǎn)換判斷函數(shù)** \return >0 轉(zhuǎn)換已完成* \return =0 轉(zhuǎn)換未完成**/ uint8_t adc_complete(void) {return((ADC0->SC1[0] & ADC_SC1_COCO_MASK) >> ADC_SC1_COCO_SHIFT); }/** \brief ADC值轉(zhuǎn)換函數(shù)** \return 返回轉(zhuǎn)換后的ADC電壓值**/ uint32_t read_adc_chx(uint8_t ChanIndex) {uint16_t adc_result = 0;adc_result = ADC0->R[ChanIndex]; /* For SW trigger mode, R[0] is used */return(uint32_t)((5000 * adc_result) / 0xFFF); /* Convert result to mv for 0-5V range */ }void ADC0_IRQHandler(void) {adcRawValue1 = read_adc_chx(0);adcRawValue2 = read_adc_chx(1);adcConvDone = true; }

    總結(jié)

    以上是生活随笔為你收集整理的S32K系列之ADC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。