国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣

這篇具有很好參考價值的文章主要介紹了【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一 項目背景

二 原理說明

三 設計實現(xiàn)——定時器初始化

四 設計實現(xiàn)——PWM捕獲

五 梳理總結


一 項目背景

? ? ? ? 目前使用了TI的ADC采樣芯片ADS1018實現(xiàn)模擬量4-20mA/0-20mA的采樣,原理是將外部輸入的模擬量信號4-20mA,經(jīng)由并聯(lián)的兩個100Ω電阻,轉(zhuǎn)換為0.2-1V的電壓信號傳遞到模數(shù)轉(zhuǎn)換芯片的入口,再由ADS1018(全量程設置為FS=±1.024V,對應碼為0x7FF)將0.2-1V電壓信號轉(zhuǎn)換為數(shù)據(jù)碼0x190-0x7D0(400-2000),即可以將外部輸入4-20mA與內(nèi)部采集數(shù)據(jù)400-2000對應上,如下圖所示:

【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣

? ? ? ? 但是限于成本和貨期的問題,考慮將該款ADC換成國產(chǎn)的其他方案。

? ? ? ? 又因為這邊AD采樣的是DCS或者PLC發(fā)出來的4-20mA/0-20mA信號,必須需要外加隔離,所以不能采用MCU自帶的ADC外設直接采樣的方案(MCU的ADC外設沒有隔離功能,必須外接隔離芯片才行),所以該方案舍棄。

? ? ? ? 找到一款客益電子(http://www.guestgood.com/)的APC/PAC芯片,可以將輸入的模擬信號轉(zhuǎn)化為PWM波的占空比輸出,這邊選用的APC芯片為GP9101。

二 原理說明

【1】APC/PAC芯片原理:

????????A=Analog,P=PWM,C=Convertor。

? ? ? ? APC=Analog to PWM Convertor 是一種模擬信號轉(zhuǎn)PWM信號的專用芯片,PAC=PWM to Analog Convertor是一種PWM信號轉(zhuǎn)模擬信號的專用芯片。

????????在信號調(diào)理領域,經(jīng)常需要面對模擬量信號的傳輸、采集、控制等問題,傳統(tǒng)的信號鏈芯片包括模數(shù)轉(zhuǎn)換器(ADC)、數(shù)模轉(zhuǎn)換器(DAC)、運算放大器(OpAmp)、比較器(Comparator)等等,它們扮演著模數(shù)混合信號處理的主要角色。信號鏈芯片的功能基礎而強大,經(jīng)過精心的設計后能形成多種多樣優(yōu)秀的信號處理電路。但即便如此,在很多應用領域,傳統(tǒng)的信號鏈芯片依然存在瓶頸和制約,無法達到理想的電路性能和技術指標,尤其在一些需要PWM信號的領域,傳統(tǒng)的方法遇到許多困難。

? ? ? ? 客益電子發(fā)明了一種新型的模擬信號處理的專用芯片,它實現(xiàn)了模擬信號與PWM信號間的高精度轉(zhuǎn)換功能,我們稱它為APC(Analog to PWM Convertor)和PAC(PWM to Analog Convertor)。?

【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣

【2】芯片特性:

? ? ? ? 這邊采用的芯片GP9101將輸入0-VCC的信號轉(zhuǎn)化為占空比0-100%,頻率默認為1KHz的PWM波輸出

【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣

【3】采樣原理:

? ? ? ? 參考上面ADC采樣的思路,將外部輸入的模擬量信號4-20mA,經(jīng)由并聯(lián)的兩個400Ω電阻,轉(zhuǎn)換為0.8-4V的電壓信號傳遞到APC芯片的入口,再由GP9101(供電Vcc=5V)將0.8-4V電壓信號轉(zhuǎn)換為占空比為16-80%的PWM交由MCU進行捕獲,即可以將外部輸入4-20mA與內(nèi)部采集數(shù)據(jù)對應上,如下圖所示:

【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣

三 設計實現(xiàn)——定時器初始化

? ? ? ? 由上面的方案,首先需要實現(xiàn)的是定時器捕獲PWM功能的初始化,我這邊使用的主控芯片為小華的HC32F460,選用其高級控制定時器Timer6進行PWM捕獲,端口選用PB13,其功能是TIMER6_1_PWMB(Timer6的1單元B通道):

【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣

????????初始化程序如下:

/* TIMER6 unit and clock definition */
#define TIMER6_UNIT1                    (M4_TMR61)
#define TIMER6_UNIT1_CLOCK              (PWC_FCG2_PERIPH_TIM61)
/* TIMER6 channel B Port/Pin definition */
#define TIMER6_UNIT1_CHB                (Timer6GenCompareB)
#define TIMER6_UNIT1_CHB_PORT           (PortB)
#define TIMER6_UNIT1_CHB_PIN            (Pin13)
#define TIMER6_UNIT1_CHB_FUNC           (Func_Tim6)


void Timer6_APC_Config(void)  //APC測試,采樣0.8V-4V電壓,APC輸出16%-80%占空比,經(jīng)過64分頻定時器捕獲,輸出比較值為420-2100(輸入K/B需要調(diào)整為2100/400)
{
    stc_timer6_basecnt_cfg_t         stcTIM6BaseCntCfg;
    stc_timer6_port_input_cfg_t      stcTIM6CapxCfg;
    
    MEM_ZERO_STRUCT(stcTIM6BaseCntCfg);
    MEM_ZERO_STRUCT(stcTIM6CapxCfg);
    
    PWC_Fcg2PeriphClockCmd(TIMER6_UNIT1_CLOCK, Enable);
    
    PORT_SetFunc(TIMER6_UNIT1_CHB_PORT, TIMER6_UNIT1_CHB_PIN, TIMER6_UNIT1_CHB_FUNC, Disable);    //Timer61 PWMA
    
    stcTIM6BaseCntCfg.enCntMode   = Timer6CntSawtoothMode;              //Sawtooth wave mode
    stcTIM6BaseCntCfg.enCntDir    = Timer6CntDirUp;                     //Counter counting up
    stcTIM6BaseCntCfg.enCntClkDiv = Timer6PclkDiv64;                   //Count clock: pclk0/64(256分頻也可以試一試)
    Timer6_Init(TIMER6_UNIT1, &stcTIM6BaseCntCfg);                          //timer6 PWM frequency, count mode and clk config

    Timer6_SetPeriod(TIMER6_UNIT1, Timer6PeriodA, 0xFFFFu);               //Period set

    stcTIM6CapxCfg.enPortSel  = Timer6xCHB;                            //Capture Input Port: PWM B port
    stcTIM6CapxCfg.enPortMode = Timer6ModeCaptureInput;                //Capture input function
    stcTIM6CapxCfg.bFltEn     = true;                                  //Input filter enable
    stcTIM6CapxCfg.enFltClk   = Timer6FltClkPclk0Div16;                //Filter clock
    Timer6_PortInputConfig(TIMER6_UNIT1, &stcTIM6CapxCfg);                 //Input config

    Timer6_ConfigHwCaptureB(TIMER6_UNIT1, Timer6HwTrigPWMBRise);       //HW Capture: Timer6 PWMB port rise trig

    Timer6_ConfigHwClear(TIMER6_UNIT1, Timer6HwTrigPWMBFall);          //HW Clear: Timer6 PWMB port fall trig
    Timer6_EnableHwClear(TIMER6_UNIT1);
    
    /*start timer6*/
    Timer6_StartCount(TIMER6_UNIT1);
}

【注】也可以使用中斷進行捕獲:

/* TIMER6 unit and clock definition */
#define TIMER6_UNIT1                    (M4_TMR61)
#define TIMER6_UNIT1_CLOCK              (PWC_FCG2_PERIPH_TIM61)
/* TIMER6 channel B Port/Pin definition */
#define TIMER6_UNIT1_CHB                (Timer6GenCompareB)
#define TIMER6_UNIT1_CHB_PORT           (PortB)
#define TIMER6_UNIT1_CHB_PIN            (Pin13)
#define TIMER6_UNIT1_CHB_FUNC           (Func_Tim6)

uint16_t u16CaptureA;
void Timer61_CapInputCallBack(void)
{
    u16CaptureA = Timer6_GetGeneralCmpValue(TIMER6_UNIT1, TIMER6_UNIT1_CHB);
}

void Timer6_APC_Config(void)  //APC測試,采樣0.8V-4V電壓,APC輸出16%-80%占空比,經(jīng)過64分頻定時器捕獲,輸出比較值為420-2100(輸入K/B需要調(diào)整為2100/400)
{
    stc_timer6_basecnt_cfg_t         stcTIM6BaseCntCfg;
    stc_timer6_port_input_cfg_t      stcTIM6CapxCfg;
    stc_irq_regi_conf_t              stcIrqRegiConf;
    
    MEM_ZERO_STRUCT(stcTIM6BaseCntCfg);
    MEM_ZERO_STRUCT(stcTIM6CapxCfg);
    MEM_ZERO_STRUCT(stcIrqRegiConf);
    
    PWC_Fcg2PeriphClockCmd(TIMER6_UNIT1_CLOCK, Enable);
    
    PORT_SetFunc(TIMER6_UNIT1_CHB_PORT, TIMER6_UNIT1_CHB_PIN, TIMER6_UNIT1_CHB_FUNC, Disable);    //Timer61 PWMA
    
    stcTIM6BaseCntCfg.enCntMode   = Timer6CntSawtoothMode;              //Sawtooth wave mode
    stcTIM6BaseCntCfg.enCntDir    = Timer6CntDirUp;                     //Counter counting up
    stcTIM6BaseCntCfg.enCntClkDiv = Timer6PclkDiv64;                   //Count clock: pclk0/64(256分頻也可以試一試)
    Timer6_Init(TIMER6_UNIT1, &stcTIM6BaseCntCfg);                          //timer6 PWM frequency, count mode and clk config

    Timer6_SetPeriod(TIMER6_UNIT1, Timer6PeriodA, 0xFFFFu);               //Period set

    stcTIM6CapxCfg.enPortSel  = Timer6xCHB;                            //Capture Input Port: PWM B port
    stcTIM6CapxCfg.enPortMode = Timer6ModeCaptureInput;                //Capture input function
    stcTIM6CapxCfg.bFltEn     = true;                                  //Input filter enable
    stcTIM6CapxCfg.enFltClk   = Timer6FltClkPclk0Div16;                //Filter clock
    Timer6_PortInputConfig(TIMER6_UNIT1, &stcTIM6CapxCfg);                 //Input config

    Timer6_ConfigHwCaptureB(TIMER6_UNIT1, Timer6HwTrigPWMBRise);       //HW Capture: Timer6 PWMB port rise trig

    Timer6_ConfigHwClear(TIMER6_UNIT1, Timer6HwTrigPWMBFall);          //HW Clear: Timer6 PWMB port fall trig
    Timer6_EnableHwClear(TIMER6_UNIT1);

    /*config interrupt*/
    Timer6_ConfigIrq(TIMER6_UNIT1, Timer6INTENB, true);

    stcIrqRegiConf.enIRQn = Int003_IRQn;                    //Register INT_TMR61_GUDF Int to Vect.No.002
    stcIrqRegiConf.enIntSrc = INT_TMR61_GCMB;               //Select Event interrupt function
    stcIrqRegiConf.pfnCallback = &Timer61_CapInputCallBack; //Callback function
    enIrqRegistration(&stcIrqRegiConf);                     //Registration IRQ

    NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);            //Clear Pending
    NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_04);//Set priority
    NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);                   //Enable NVIC

    /*start timer6*/
    Timer6_StartCount(TIMER6_UNIT1);
}

四 設計實現(xiàn)——PWM捕獲

????????因為輸入到MCU的PWM頻率為1KHz,所以捕獲定時器的周期值為:

? ? ? ? 捕獲到的PWM比較值即為:

? ? ? ? 所以由上面方案中采樣到的4-20mA對應的占空比16-80%,計算得到的比較值即為:

? ? ? ? 程序中的PWM捕獲采用Timer6_GetGeneralCmpValue接口:

/**************************************************************************
* 函數(shù)名稱: analogInputHandle
* 功能描述: 模擬量輸入處理
* 輸入?yún)?shù):
* 輸出參數(shù):
* 返 回 值:
* 其它說明:
**************************************************************************/
float analogInputHandle(STRU_ANALOG_IO_CTRL *p_analog_ctrl)
{
    //...
    //這邊捕獲到的比較值是根據(jù)輸入進來的PWM計算得到的
    remote_ctrl.AI1_read = Timer6_GetGeneralCmpValue(TIMER6_UNIT1, TIMER6_UNIT1_CHB);
    //...
}

? ? ? ? 采集得到的remote_ctrl.AI1_read再經(jīng)過公式(本例中,K=2100,B=420),對應得到4-20:

【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣

五 梳理總結

? ? ? ? 這個APC替代ADC用于采樣模擬量輸入的方案,使用比較簡單方便,但是精度并沒有之前使用的ADS1018(12位精度)那么好,適用于對精度要求不高的場景。文章來源地址http://www.zghlxwxcb.cn/news/detail-423815.html

到了這里,關于【嵌入式】HC32F定時器PWM捕獲+APC芯片實現(xiàn)模擬AD采樣的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【藍橋杯嵌入式】定時器實現(xiàn)按鍵單擊,雙擊,消抖以及長按的代碼實現(xiàn)

    【藍橋杯嵌入式】定時器實現(xiàn)按鍵單擊,雙擊,消抖以及長按的代碼實現(xiàn)

    ??【藍橋杯嵌入式】專題正在持續(xù)更新中,原理圖解析?,各模塊分析?以及歷年真題講解?都在這兒哦,歡迎大家前往訂閱本專題,獲取更多詳細信息哦?????? ??本系列專欄 - ?藍橋杯嵌入式_勾欄聽曲_0的博客 ??歡迎大家 ??? ?點贊?? ?評論?? ?收藏?? ??個人主

    2024年01月17日
    瀏覽(20)
  • 【嵌入式】HC32F460串口接收超時中斷+DMA

    【嵌入式】HC32F460串口接收超時中斷+DMA

    ????????項目需要使用一款UART串口編碼器,編碼器的數(shù)據(jù)以波特率57600持續(xù)向外發(fā)送。但這組數(shù)據(jù)包沒有固定的包頭和校驗尾,僅僅是由多圈圈數(shù)和單圈角度組成的六字節(jié)數(shù)據(jù)碼,這樣接收到的數(shù)組無法確定實際的下標,所以這邊考慮用串口接收超時中斷+DMA來實現(xiàn)。 【

    2024年02月14日
    瀏覽(21)
  • 【嵌入式】HC32F07X CAN通訊配置和使用&配置不同緩沖器以連續(xù)發(fā)送

    【嵌入式】HC32F07X CAN通訊配置和使用&配置不同緩沖器以連續(xù)發(fā)送

    ? ? ? ? 使用小華(華大)的MCU HC32F07X實現(xiàn) CAN 通訊配置和使用 【1】 CAN原理說明 (參考文章《CAN通信詳解》): ????????CAN是控制器局域網(wǎng)絡(Controller Area Network, CAN)的簡稱,是一種能夠?qū)崿F(xiàn)分布式實時控制的串行通信網(wǎng)絡。 ? ? ? ? (i) CAN通信形式 :CAN 使用稱為 C

    2024年02月06日
    瀏覽(51)
  • 嵌入式培訓機構四個月實訓課程筆記(完整版)-Linux ARM驅(qū)動編程第二天-ARM中斷、定時器、看門狗(物聯(lián)技術666)

    嵌入式培訓機構四個月實訓課程筆記(完整版)-Linux ARM驅(qū)動編程第二天-ARM中斷、定時器、看門狗(物聯(lián)技術666)

    鏈接:https://pan.baidu.com/s/1E4x2TX_9SYhxM9sWfnehMg?pwd=1688 提取碼:1688 上午:中斷 ????????? 呂峰老師 下午:定時器 教學內(nèi)容: 一、中斷 ARM 中斷分為二級,分為一級中斷和二級中斷,二級中斷為子中斷,對于 ARM 來說有 50 個中斷源, 其中有 32+ ( EINT23-4 ) 23-4+1-2=50 子中斷源

    2024年02月19日
    瀏覽(26)
  • 【小黑嵌入式系統(tǒng)第十五課】μC/OS-III程序設計基礎(四)——消息隊列(工作方式&數(shù)據(jù)通信&生產(chǎn)者消費者模型)、動態(tài)內(nèi)存管理、定時器管理

    【小黑嵌入式系統(tǒng)第十五課】μC/OS-III程序設計基礎(四)——消息隊列(工作方式&數(shù)據(jù)通信&生產(chǎn)者消費者模型)、動態(tài)內(nèi)存管理、定時器管理

    上一課: 【小黑嵌入式系統(tǒng)第十四課】μC/OS-III程序設計基礎(三)——信號量(任務同步資源同步)、事件標記組(與或多個任務) 下一課: 【小黑嵌入式系統(tǒng)第十六課】PSoC 5LP第三個實驗——μC/OS-III 綜合實驗 前些天發(fā)現(xiàn)了一個巨牛的人工智能學習網(wǎng)站,通俗易懂,風趣

    2024年01月17日
    瀏覽(24)
  • GD32F103x 定時器

    GD32F103x 定時器

    STM32的定時器主要分為三種: 高級定時器、通用定時器、基本定時器 。 即:高級定時器具有捕獲/比較通道和互補輸出,死區(qū)時間,通用定時器只有捕獲/比較通道,基本定時器沒有以上兩者。? 1. 基本定時器 1.時鐘源 時鐘源來自RCC的CK_TIMER,就是內(nèi)部時鐘(CK_INT)直接經(jīng)過控

    2024年02月07日
    瀏覽(20)
  • STM32F4X 定時器中斷

    STM32F4X 定時器中斷

    定時器(Timer)最基本的功能就是定時,比如定時翻轉(zhuǎn)LED燈,定時向串口發(fā)送數(shù)據(jù)等。除此之外,定時器還可以跟GPIO結合使用,利用定時器產(chǎn)生PWM波形,利用定時器捕捉電平信號等。本章先來講解定時器的最基本的用法,定時功能。 STM32F4X將定時器分成3類,分別是基本定時器,

    2024年02月12日
    瀏覽(23)
  • STM32F407 滴答定時器

    STM32F407 滴答定時器

    介紹STM32F407滴答定時器配置方法、使用方式,封裝延時函數(shù)得到精確的時間。 STM32F407參考手冊中第10章介紹了滴答定時器的校準值。 M4權威指南介紹滴答定時器的章節(jié),M3權威指南中與M4權威指南中的介紹一樣。 在sys.c文件中增加滴答定時器的代碼 在delay.c文件增加以下代碼

    2024年02月11日
    瀏覽(30)
  • 【MT32F006】MT32F006之定時器延時

    【MT32F006】MT32F006之定時器延時

    本文最后修改時間:2023年03月30日 一、本節(jié)簡介 本文介紹如何使用MT32F006的定時器做us、ms級的延時。 二、實驗平臺 庫版本:V1.0.0 編譯軟件:MDK5.37 硬件平臺:MT32F006開發(fā)板(主芯片MT32F006) 仿真器:JLINK 三、版權聲明 1)作者:甜甜的大香瓜 2)聲明:喝水不忘挖井人,轉(zhuǎn)載

    2024年02月12日
    瀏覽(20)
  • STM32F1定時器-PWM輸出

    STM32F1定時器-PWM輸出

    STM32 PWM工作過程 ARR寄存器決定PWM周期,CCR寄存器決定占空比 通道1為例 的PWM輸出電路圖 CCR1:捕獲比較(值)寄存器(x =1,2,3,4):設置比較值。 CCMR1:OC1M[2:0]位:對于PWM方式下,用于設置PWM模式1【110】 或者PWM模式2【111】 CCER:CC1P位:輸入/捕獲1輸出極性。0:高電平有效,1:低電平

    2024年02月09日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包