讀取adc


#include "gd32vf103.h"
#include "systick.h"
#include <stdint.h>
#include "lcd/lcd.h"

#define ANALOG_PORT GPIOA
#define ANALOG_PIN GPIO_PIN_3
#define ANALOG_CHANNEL ADC_CHANNEL_3

#define RED_LED_PIN GPIO_PIN_13
#define RED_LED_PORT GPIOC

void init_ADC_example();

int main(void)
{
    uint16_t analog_read = 0;

    /* config ADC */
    /* 配置 ADC */
    init_ADC_example();

    Lcd_Init(); // init OLED
    LCD_Clear(BLACK);
    // 顯示漢字“中景園”
    LCD_ShowChinese(24, 0, 0, 16, YELLOW);
    LCD_ShowChinese(48, 0, 1, 16, RED);
    LCD_ShowChinese(72, 0, 2, 16, GREEN);
    // 圖型變量
    u16 x = 0;
    u16 y = 48;

    /* initiate the gpio for the red led on the longan board */
    /* 初始化 GPIO 用于閃爍紅色 LED */
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_init(RED_LED_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RED_LED_PIN);

    /* This loop generates a software based PWM signal which has a duty cycle based on the read analog value 
       (if you need an actual PWM signal though check the PWM example where it's done in hardware instead) */
    while (1)
    {
        /* Read analog value on pin */
        /* 讀取引腳上的模擬值 */
        // analog_read = ADC_RDATA(ADC0);
        analog_read = adc_regular_data_read(ADC0);

        /* LCD 顯示 */
        LCD_ShowNum(80, 16, analog_read,4, MAGENTA);
        LCD_DrawPoint(x, y - 10 * analog_read / 100, BLUE);
        if (x > 159)
        {
            LCD_Clear(BLACK);
            // LCD_DrawRectangle(0,40,159,80,WHITE);
            x = 0;
        }
        x++;

        /* Red LED on */
        /* 點(diǎn)亮 LED */
        // gpio_bit_write(RED_LED_PORT, RED_LED_PIN, 0);

        /* If ADC reads a high voltage delay for a longer time */
        /* 如果 ADC 讀取高電壓延遲較長時(shí)間 */
        delay_1us(analog_read);

        /* Red LED off */
        /* 關(guān)閉 LED */
        // gpio_bit_write(RED_LED_PORT, RED_LED_PIN, 1);

        /* Delay for longer if ADC reads a low voltage */
        /* 如果 ADC 讀取低電壓业岁,則延遲更長 */
        // delay_1us(4096 - analog_read);
    }
}

void init_ADC_example()
{
    /* enable GPIOC clock */
    /* 打開 GPIO_C 時(shí)鐘 */
    rcu_periph_clock_enable(RCU_GPIOC);
    /* Initialize the GPIO that will be used for ADC. A0-A7 and B0-B1 are connected to an ADC-channel each. */
    /* 初始化將用于 ADC 的 GPIO。 A0-A7 和 B0-B1 分別連接到一個(gè) ADC 通道 */
    gpio_init(ANALOG_PORT, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, ANALOG_PIN);
    /* enable ADC clock */
    /* 打開 ADC 時(shí)鐘 */
    rcu_periph_clock_enable(RCU_ADC0);

    /* Select the clock frequency that will be used for the ADC core. Refer to README for more info on what to select. */
    /* 選擇將用于 ADC 內(nèi)核的時(shí)鐘頻率纬乍。有關(guān)選擇內(nèi)容的更多信息第晰,請參閱自述文件 */
    // 108mhz 8分頻 13mhz  采樣周期 239.5+12.5 =252 個(gè)時(shí)鐘周期 除以 13mhz = 19.38us 頻率為 51587.3hz
    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);

    /* Reset ADC0 configuration. GD32VF103 has two internal ADCs (ADC0, ADC1). */
    /* 重置 ADC_0 通道锁孟, 此芯片有兩個(gè) ADC 通道  */
    adc_deinit(ADC0);

    /* Set the ADCs to work independently. Refer to the manual for the different parallel modes available. */
    /* 將 ADC 設(shè)置為獨(dú)立工作。有關(guān)可用的不同并行模式茁瘦,請參閱手冊 */
    adc_mode_config(ADC_MODE_FREE);

    /* Set the conversion mode to continuous. Continious mode lets the ADC take measurements continiously without
       an external trigger. */
    /* 將轉(zhuǎn)換模式設(shè)置為連續(xù)品抽。連續(xù)模式讓 ADC 連續(xù)進(jìn)行測量,而無需一個(gè)外部觸發(fā)器甜熔。 */
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);

    /* Sets where padding is applied to the measurement. Data alignment right puts padding bits above MSB */
    /* 設(shè)置將填充應(yīng)用于測量的位置圆恤。數(shù)據(jù)對齊右將填充位置于 MSB 之上 */
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

    /* Selects how many channels to convert each time. This can be used to "queue" multiple channels. Here just one channel is selected. */
    /* 選擇每次轉(zhuǎn)換多少個(gè)頻道。這可用于“排隊(duì)”多個(gè)頻道腔稀。這里只選擇了一個(gè)頻道 */
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);

    /* Set the channel as the first "queued" conversion each time the ADC is activated. */
    /* 每次激活 ADC 時(shí)將通道設(shè)置為第一個(gè)“排隊(duì)”轉(zhuǎn)換,設(shè)置 adc 采周期*/
    adc_regular_channel_config(ADC0, 0, ANALOG_CHANNEL, ADC_SAMPLETIME_239POINT5);
    // 配置分辨率 12位
    adc_resolution_config(ADC0,ADC_RESOLUTION_12B);

    /* Since we are using continious conversion we do not want to use an external trigger. */
    /* 由于我們使用的是連續(xù)轉(zhuǎn)換哑了,我們不想使用外部觸發(fā)器 */
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE);
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

    /**
     * @brief ADC 校準(zhǔn)過程
     * 內(nèi)部的模擬校準(zhǔn)通過設(shè)置 ADC_CTL1 寄存器的 RSTCLB 位來重置。
     * 1. 確保ADCON=1烧颖;
     * 2. 延遲14個(gè)ADCCLK以等待ADC穩(wěn)定弱左;
     * 3. 設(shè)置RSTCLB (可選的);
     * 4. 設(shè)置CLB=1炕淮;
     * 5. 等待直到CLB=0拆火。
     */
    /* Enable ADC.*/
    /* 打開 ADC */
    adc_enable(ADC0); //  ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_ADCON;

    /* Let ADC stabilize */
    /* 讓ADC穩(wěn)定 */
    delay_1ms(1); // 第二步 等 ADC 穩(wěn)定,最少14個(gè) ADC 時(shí)鐘周期

    /* Calibrates the ADC against an internal source. */
    /* 根據(jù)內(nèi)部源校準(zhǔn) ADC */
    adc_calibration_enable(ADC0); // 第三涂圆、四们镜、五步完成校準(zhǔn)

    /* Start converting */
    /* 開始轉(zhuǎn)換 */
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市润歉,隨后出現(xiàn)的幾起案子模狭,更是在濱河造成了極大的恐慌,老刑警劉巖踩衩,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚼鹉,死亡現(xiàn)場離奇詭異,居然都是意外死亡驱富,警方通過查閱死者的電腦和手機(jī)锚赤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褐鸥,“玉大人线脚,你說我怎么就攤上這事。” “怎么了浑侥?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵姊舵,是天一觀的道長。 經(jīng)常有香客問我寓落,道長括丁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任零如,我火速辦了婚禮,結(jié)果婚禮上锄弱,老公的妹妹穿的比我還像新娘考蕾。我一直安慰自己,他們只是感情好会宪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布肖卧。 她就那樣靜靜地躺著,像睡著了一般掸鹅。 火紅的嫁衣襯著肌膚如雪塞帐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天巍沙,我揣著相機(jī)與錄音葵姥,去河邊找鬼。 笑死句携,一個(gè)胖子當(dāng)著我的面吹牛榔幸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矮嫉,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼削咆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蠢笋?” 一聲冷哼從身側(cè)響起拨齐,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昨寞,沒想到半個(gè)月后瞻惋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡援岩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年熟史,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窄俏。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹂匹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凹蜈,到底是詐尸還是另有隱情限寞,我是刑警寧澤忍啸,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站履植,受9級特大地震影響计雌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玫霎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一凿滤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庶近,春花似錦翁脆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叉钥,卻和暖如春罢缸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背投队。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工枫疆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敷鸦。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓养铸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轧膘。 傳聞我的和親對象是個(gè)殘疾皇子钞螟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容