#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);
}
讀取adc
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褐鸥,“玉大人线脚,你說我怎么就攤上這事。” “怎么了浑侥?”我有些...
- 文/不壞的土叔 我叫張陵姊舵,是天一觀的道長。 經(jīng)常有香客問我寓落,道長括丁,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任零如,我火速辦了婚禮,結(jié)果婚禮上锄弱,老公的妹妹穿的比我還像新娘考蕾。我一直安慰自己,他們只是感情好会宪,可當(dāng)我...
- 文/花漫 我一把揭開白布肖卧。 她就那樣靜靜地躺著,像睡著了一般掸鹅。 火紅的嫁衣襯著肌膚如雪塞帐。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼削咆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蠢笋?” 一聲冷哼從身側(cè)響起拨齐,我...
- 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昨寞,沒想到半個(gè)月后瞻惋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡援岩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年熟史,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窄俏。...
- 正文 年R本政府宣布,位于F島的核電站履植,受9級特大地震影響计雌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玫霎,卻給世界環(huán)境...
- 文/蒙蒙 一凿滤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庶近,春花似錦翁脆、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叉钥,卻和暖如春罢缸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背投队。 一陣腳步聲響...
- 正文 我出身青樓养铸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轧膘。 傳聞我的和親對象是個(gè)殘疾皇子钞螟,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- MM32F003內(nèi)置溫度傳感器,可以ADC通道讀取溫度傳感器的電壓值谎碍,根據(jù)官方提供的計(jì)算公式鳞滨,算出當(dāng)前芯片的溫度。...
- 器材 1x Tequila Nano + RA_LINK 調(diào)試器 1x 電位器 3x 杜邦線 電路連接 Tequi...
- MM32F003內(nèi)部有一個(gè)1.2V的參考電壓蟆淀,可以通過ADC通道讀取拯啦。但是可能這個(gè)參考電壓并不準(zhǔn)確。因?yàn)槭褂?.2...
- MM32F003的ADC可以通過啟用DMA功能熔任,加快ADC數(shù)據(jù)的獲取褒链,并減輕系統(tǒng)開銷。本例程通過開啟DMA中斷疑苔,直...