一、什么是ADC
ADC(Analogto-Digital Converter)模擬數(shù)字轉(zhuǎn)換器,是將模擬信號轉(zhuǎn)換成數(shù)字信號的一種外設(shè)。比如某一個電阻兩端的是一個模擬信號,單片機無法直接采集,此時需要ADC先將短租兩端的電壓這個模擬信號轉(zhuǎn)化成數(shù)字信號,單片機才能夠進(jìn)行處理。
二、ADC的用途
ADC具有將模擬信號轉(zhuǎn)換成數(shù)字信號的能力,比如將模擬的電壓轉(zhuǎn)換成數(shù)字信號,單片機進(jìn)行處理??梢杂米鳒囟缺O(jiān)測或者電流監(jiān)測等方面,用途極廣。
三、STM32F103ZET6的ADC
根據(jù)中文參考手冊介紹,STM32F103ZET6單片機有3個12位ADC,共有18個通道,可測量16個外部和2個內(nèi)部信號源。各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC的結(jié)果可以左對齊或右對齊方式存儲在16位數(shù)據(jù)寄存器中。ADC的輸入時鐘不得超過14MHz
,它是由PCLK2經(jīng)分頻產(chǎn)生。
3.1 ADC通道對應(yīng)引腳
STM32F103ZET6的ADC各通道對應(yīng)IO如下
3.2ADC時鐘
ADC輸入時鐘ADC_CLK由APB2分頻產(chǎn)生,最大值是14MHz。庫函數(shù)提供了設(shè)置分頻因子的函數(shù)
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)
可選的分頻因子有
#define RCC_PCLK2_Div2 ((uint32_t)0x00000000)
#define RCC_PCLK2_Div4 ((uint32_t)0x00004000)
#define RCC_PCLK2_Div6 ((uint32_t)0x00008000)
#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000)
APB2總線時鐘為72MHz,而ADC的最大工作頻率為14MHz,所以,分頻因子一般設(shè)置為6,這樣ADC的輸入時鐘頻率為12MHz。
3.3 ADC工作模式
根據(jù)中文參考手冊介紹,STM32F1的ADC有三種工作模式
? 單次轉(zhuǎn)換模式 單次轉(zhuǎn)換模式下,ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過設(shè)置ADC_CR2寄存器的ADON位(只適用于規(guī)則通道)啟動也可通過外部觸發(fā)啟動(適用于規(guī)則通道或注入通道),這時CONT位為0。
? 連續(xù)轉(zhuǎn)換模式 在連續(xù)轉(zhuǎn)換模式中,當(dāng)前面ADC轉(zhuǎn)換一結(jié)束馬上就啟動另一次轉(zhuǎn)換。此模式可通過外部觸發(fā)啟動或通過設(shè)置ADC_CR2寄存器上的ADON位啟動,此時CONT位是1。
? 掃描模式
33.4 ADC轉(zhuǎn)換時間
ADC的總轉(zhuǎn)換時間與時鐘頻率有關(guān),
總轉(zhuǎn)換時間 = 采樣時間 + 12.5個周期
。其中,采樣時間最短為1.5個周期,也就是最短轉(zhuǎn)換時間為14個時鐘周期。使用軟件觸發(fā)時,可選擇的采樣時間如下
#define ADC_SampleTime_1Cycles5 ((uint8_t)0x00)
#define ADC_SampleTime_7Cycles5 ((uint8_t)0x01)
#define ADC_SampleTime_13Cycles5 ((uint8_t)0x02)
#define ADC_SampleTime_28Cycles5 ((uint8_t)0x03)
#define ADC_SampleTime_41Cycles5 ((uint8_t)0x04)
#define ADC_SampleTime_55Cycles5 ((uint8_t)0x05)
#define ADC_SampleTime_71Cycles5 ((uint8_t)0x06)
#define ADC_SampleTime_239Cycles5 ((uint8_t)0x07)
3.5 ADC校準(zhǔn)
使能ADC后,需要對ADC進(jìn)行校準(zhǔn)。使用庫函數(shù)開發(fā)時,提供了ADC校準(zhǔn)的函數(shù)
ADC_ResetCalibration(ADC1);//重置指定的ADC的校準(zhǔn)寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//獲取ADC重置校準(zhǔn)寄存器的狀態(tài)
ADC_StartCalibration(ADC1);//開始指定ADC的校準(zhǔn)狀態(tài)
while(ADC_GetCalibrationStatus(ADC1));//獲取指定ADC的校準(zhǔn)程序
3.6 ADC轉(zhuǎn)換結(jié)果與實際電壓的換算
獲取到的AD轉(zhuǎn)換結(jié)果并不是實際電壓,如果想要得到實際電壓,需要經(jīng)過換算。上面介紹了,STM32的ADC為12位,也就是AD值取值范圍為0~4095。采集電壓范圍為0到3.3V。AD值與實際電壓之間存在比例關(guān)系。
實際電壓 = (AD值 / 4095) * 3.3
。單位為伏特(V)
四、ADC配置步驟
? 使能GPIO時鐘和ADC時鐘,設(shè)置引腳為模擬輸入
? 設(shè)置ADC的分頻因子
? 初始化ADC參數(shù),包括ADC工作模式,規(guī)則序列等
? 使能ADC并校準(zhǔn)
? 觸發(fā)AD轉(zhuǎn)換,讀取AD轉(zhuǎn)換值
五、ADC配置程序
55.1 ADC初始化程序
這里以配置ADC1的通道1為例,給出ADC的配置例程,分頻因子設(shè)置為6,單次轉(zhuǎn)換模式,軟件觸發(fā)。
/*
*==============================================================================
*函數(shù)名稱:ADC1_Init
*函數(shù)功能:初始化ADCx
*輸入?yún)?shù):無
*返回值:無
*備 注:無
*==============================================================================
*/
void ADC1_Init(void)
{
// 結(jié)構(gòu)體定義
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
// 開啟時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
// 設(shè)置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
// GPIO配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //ADC1通道1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; // 模擬輸入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// ADC參數(shù)配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 獨立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 非掃描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 關(guān)閉連續(xù)轉(zhuǎn)換
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 禁止觸發(fā)檢測,使用軟件觸發(fā)
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1; // 1個轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1
ADC_Init(ADC1, &ADC_InitStructure); // ADC初始化
ADC_Cmd(ADC1, ENABLE); // 開啟AD轉(zhuǎn)換器
// ADC校準(zhǔn)
ADC_ResetCalibration(ADC1); // 重置指定的ADC的校準(zhǔn)寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); // 獲取ADC重置校準(zhǔn)寄存器的狀態(tài)
ADC_StartCalibration(ADC1); // 開始指定ADC的校準(zhǔn)狀態(tài)
while(ADC_GetCalibrationStatus(ADC1)); // 獲取指定ADC的校準(zhǔn)程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能或者失能指定的ADC的軟件轉(zhuǎn)換啟動功能
}
5.2 軟件觸發(fā)AD轉(zhuǎn)換
庫函數(shù)開發(fā),配置為軟件觸發(fā)時,可以通過下面的函數(shù)觸發(fā)AD轉(zhuǎn)換
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
5.3 讀取AD轉(zhuǎn)換結(jié)果
庫函數(shù)提供了用于讀取AD轉(zhuǎn)換結(jié)果的函數(shù)
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
這里給出另一個函數(shù),用于軟件觸發(fā)AD轉(zhuǎn)換并讀取轉(zhuǎn)換結(jié)果
/*
*==============================================================================
*函數(shù)名稱:Get_ADC_Value
*函數(shù)功能:讀取某一規(guī)則通道AD值
*輸入?yún)?shù):ch:規(guī)則通道ADC_Channel_x;times:讀取次數(shù)
*返回值:無
*備 注:該函數(shù)配置好后,返回的結(jié)果是N次后的平均值
*==============================================================================
*/
u16 Get_ADC_Value(u8 ch,u8 times)
{
u32 temp_val = 0;
u8 t;
// 設(shè)置指定ADC的規(guī)則組通道,一個序列,采樣時間
// ADC1,ADC通道,239.5個周期,提高采樣時間可以提高精確度
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
for(t=0;t< times;t++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能指定的ADC1的軟件轉(zhuǎn)換啟動功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); // 等待轉(zhuǎn)換結(jié)束
temp_val+=ADC_GetConversionValue(ADC1);
delay_ms(5);
}
return temp_val/times;
}
六、實戰(zhàn)項目
用ADC1的通道1采集某電阻兩端電壓(由于普中核心板沒有可供采集的電阻,可以直接將采集引腳接到3.3V查看一下結(jié)果),將結(jié)果通過串口打印到電腦。其中關(guān)于串口的配置就不再做介紹,給出ADC的配置和main函數(shù)。
6.1 ADC初始化
/*
*==============================================================================
*函數(shù)名稱:ADC1_Init
*函數(shù)功能:初始化ADCx
*輸入?yún)?shù):無
*返回值:無
*備 注:無
*==============================================================================
*/
void ADC1_Init(void)
{
// 結(jié)構(gòu)體定義
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
// 開啟時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
// 設(shè)置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
// GPIO配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //ADC1通道1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; // 模擬輸入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// ADC參數(shù)配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 獨立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 非掃描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 關(guān)閉連續(xù)轉(zhuǎn)換
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 禁止觸發(fā)檢測,使用軟件觸發(fā)
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1; // 1個轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1
ADC_Init(ADC1, &ADC_InitStructure); // ADC初始化
ADC_Cmd(ADC1, ENABLE); // 開啟AD轉(zhuǎn)換器
// ADC校準(zhǔn)
ADC_ResetCalibration(ADC1); // 重置指定的ADC的校準(zhǔn)寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); // 獲取ADC重置校準(zhǔn)寄存器的狀態(tài)
ADC_StartCalibration(ADC1); // 開始指定ADC的校準(zhǔn)狀態(tài)
while(ADC_GetCalibrationStatus(ADC1)); // 獲取指定ADC的校準(zhǔn)程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能或者失能指定的ADC的軟件轉(zhuǎn)換啟動功能
}
6.2 main函數(shù)
u16 gAdcAdValue = 0; // 存儲AD值
float gAdcVol = 0; // 實際電壓值
int main(void)
{
Med_Mcu_Iint(); // 系統(tǒng)初始化
while(1)
{
gAdcAdValue = Get_ADC_Value (ADC_Channel_1,10); // 獲取轉(zhuǎn)換結(jié)果
gAdcVol = (gAdcAdValue / 0xFFF) * 3.3; // 計算實際電壓
printf ("Vol=%.1f Vrn",gAdcVol); // 串口打印結(jié)果
delay_ms (500); // 防止打印過快
}
}
七、拓展
7.1 定時器觸發(fā)ADC采集
根據(jù)中文參考手冊介紹,ADC可以通過定時器觸發(fā)AD轉(zhuǎn)換(只有PWM的上升沿可以觸發(fā)AD轉(zhuǎn)換
)。觸發(fā)方式有以下幾種
- ? TIM1_CH1 :定時器 1 的通道 1 的 PWM 觸發(fā)
- ? TIM1_CH2 : 定時器 2 的通道 2 的 PWM 觸發(fā)
- ? TIM1_CH3: 定時器 1 的通道 3 的 PWM 觸發(fā)
- ? TIM2_CH2 : 定時器 2 的通道 2 的 PWM 觸發(fā)
- ? TIM3_TRGO: 定時器 3 觸發(fā)
- ? TIM4_CH4 : 定時器 4 的通道 4 的 PWM 觸發(fā)
ADC外部觸發(fā)方式
這里以TIM4的通道4觸發(fā)ADC采集為例,給出程序配置。
首先是定時器PWM的配置,不對引腳進(jìn)行重映射。
/*
*==============================================================================
*函數(shù)名稱:TIM4_CH4_PWM_Init
*函數(shù)功能:初始化定時器4的PWM通道4
*輸入?yún)?shù):per:自動重裝載值;psc:預(yù)分頻系數(shù)
*返回值:無
*備 注:無
*==============================================================================
*/
void TIM4_CH4_PWM_Init (u16 per,u16 psc)
{
// 結(jié)構(gòu)體定義
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 開啟時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
// 初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復(fù)用推挽輸出
GPIO_Init(GPIOB,&GPIO_InitStructure);
// 初始化定時器參數(shù)
TIM_TimeBaseInitStructure.TIM_Period = per; // 自動裝載值
TIM_TimeBaseInitStructure.TIM_Prescaler = psc; // 分頻系數(shù)
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 設(shè)置向上計數(shù)模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
// 初始化PWM參數(shù)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 比較輸出模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 輸出極性
TIM_OCInitStructure.TIM_Pulse = 500; // 脈沖寬度
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 輸出使能
TIM_OC4Init(TIM4,&TIM_OCInitStructure); // 輸出比較通道2初始化
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable); // 使能TIMx在 CCR2 上的預(yù)裝載寄存器
TIM_ARRPreloadConfig(TIM4,ENABLE); // 使能預(yù)裝載寄存器
TIM_Cmd(TIM4,ENABLE); // 使能定時器
}
ADC配置程序如下,觸發(fā)源選擇TIM4的CH4,使能外部觸發(fā)。
/*
*==============================================================================
*函數(shù)名稱:ADC1_Init
*函數(shù)功能:初始化ADCx
*輸入?yún)?shù):無
*返回值:無
*備 注:無
*==============================================================================
*/
void ADC1_Init(void)
{
// 結(jié)構(gòu)體定義
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
// 開啟時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
// 設(shè)置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
// 規(guī)則通道配置
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
// GPIO配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //ADC1通道1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; // 模擬輸入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// ADC參數(shù)配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 獨立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 非掃描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 關(guān)閉連續(xù)轉(zhuǎn)換
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T4_CC4; // TIM2通道2觸發(fā)
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1; // 1個轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1
ADC_Init(ADC1, &ADC_InitStructure); // ADC初始化
// 使能外部觸發(fā)
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE); // 開啟AD轉(zhuǎn)換器
// ADC校準(zhǔn)
ADC_ResetCalibration(ADC1); // 重置指定的ADC的校準(zhǔn)寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); // 獲取ADC重置校準(zhǔn)寄存器的狀態(tài)
ADC_StartCalibration(ADC1); // 開始指定ADC的校準(zhǔn)狀態(tài)
while(ADC_GetCalibrationStatus(ADC1)); // 獲取指定ADC的校準(zhǔn)程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能或者失能指定的ADC的軟件轉(zhuǎn)換啟動功能
}
main函數(shù)如下
u16 gAdcAdValue = 0; // 存儲AD值
float gAdcVol = 0; // 實際電壓值
int main(void)
{
Med_Mcu_Iint(); // 系統(tǒng)初始化
while(1)
{
gAdcAdValue = ADC_GetConversionValue (ADC1); // 獲取轉(zhuǎn)換結(jié)果
gAdcVol = (gAdcAdValue / 0xFFF) * 3.3; // 計算實際電壓
printf ("Vol=%.1f Vrn",gAdcVol); // 串口打印結(jié)果
delay_ms (500); // 防止打印過快
}
}
初始化定PWM時,程序為
TIM4_CH4_PWM_Init(1000,71); // 初始化TIM4的通道4
分頻系數(shù)為71 + 1,自動重裝載值為1000,也就是1KHz的方波,也就是觸發(fā)AD轉(zhuǎn)換的頻率為1KHz,與占空比無關(guān)。
7.2 ADC采集交流信號
ADC能夠采集的電壓范圍是0~3.3V,也就是說負(fù)電壓無法采集。比如,需要采集下圖中的一個交流信號
交流信號圖
其位于0以下的部分是無法采集的。因此,在利用STM32采集交流信號時,在交流信號輸入ADC引腳前,給交流信號增加一個直流偏置,將交流信號的最低點抬升到0以上,之后再輸入ADC引腳。
7.3 計算交流信號有效值
ADC可以用于電流監(jiān)測,實時監(jiān)測主線路中的電流。當(dāng)然,硬件方面需要搭配電流互感線圈,通過采集互感線圈兩端的電壓,來監(jiān)測主線路電流。由于一般都是交流信號,所以需要計算有效值。
根據(jù)我們所學(xué)的知識,計算交流信號有效值常用兩種方法。一種是峰峰值除以根號2,另一種是計算均方根得到有效值。通常我們采用計算均方根的方法來計算有效值。因為如果用峰峰值除以根號2去計算有效值,峰峰值很容易不準(zhǔn)確。
如果在某一個時刻,由于環(huán)境干擾或者硬件問題,導(dǎo)致突然出現(xiàn)了一個很大的值,會導(dǎo)致計算結(jié)果與實際偏差較大。關(guān)于為什么計算均方根可以得到交流信號的有效值,這里就不做介紹了,只給出部分程序設(shè)計。由于博主目前身邊沒有合適的設(shè)備驗證,因此僅供參考。
假設(shè)需要計算一個50Hz交流信號的的有效值,在其輸入到ADC采集引腳之前,增加一個穩(wěn)定的1.65V的偏置。ADC的采樣頻率為1KHz,也就是一個正弦波的周期可以采集20個點。假設(shè)采集到的AD值存儲到一個數(shù)組中,計算有效值的程序設(shè)計如下
int gAdcAdValue[20]; // 存儲采樣結(jié)果AD值的數(shù)組
int gAdcValidValue = 0; // 有效值
void Med_Adc_ValidValueCal (void)
{
int tempVar = 0; // 循環(huán)變量
int squarSum = 0; // 平方和
// 求平方和
for (tempVar = 0;tempVar < 20;tempVar ++)
{
// 減去直流偏置
gAdcAdValue[tempVar] = gAdcAdValue[tempVar] - 2048;
// 計算平方和
squarSum = squarSum + gAdcAdValue[tempVar] * gAdcAdValue[tempVar];
}
// 求平均
squarSum = squarSum / 20;
// 開根號得到均方根(有效值)
gAdcValidValue = sqrt (squarSum);
}
在進(jìn)行程序設(shè)計時需要注意不要超出數(shù)據(jù)類型范圍。在實際應(yīng)用時肯定會存在誤差,這里也簡單介紹一下誤差消除方法。目前用到的有兩種方法,第一種是分段矯正,在不同的區(qū)間內(nèi),誤差滿足線性關(guān)系時可以使用。另一種是按比例矯正,這種方法常用于誤差隨著測量值的增大而增大的情況。在計算出有效值后,減去或者加上一定比例的計算值來做矯正。
-
溫度傳感器
+關(guān)注
關(guān)注
48文章
2882瀏覽量
155651 -
GPIO
+關(guān)注
關(guān)注
16文章
1182瀏覽量
51742 -
模擬數(shù)字轉(zhuǎn)換器
+關(guān)注
關(guān)注
1文章
74瀏覽量
12449 -
STM32F103ZET6
+關(guān)注
關(guān)注
9文章
67瀏覽量
21048 -
ADC轉(zhuǎn)換
+關(guān)注
關(guān)注
0文章
12瀏覽量
3662
發(fā)布評論請先 登錄
相關(guān)推薦
評論