在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32速成筆記(7)—ADC

冬至子 ? 來(lái)源:二土電子 ? 作者:二土電子 ? 2023-10-24 09:55 ? 次閱讀

一、什么是ADC

ADC(Analogto-Digital Converter)模擬數(shù)字轉(zhuǎn)換器,是將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)的一種外設(shè)。比如某一個(gè)電阻兩端的是一個(gè)模擬信號(hào),單片機(jī)無(wú)法直接采集,此時(shí)需要ADC先將短租兩端的電壓這個(gè)模擬信號(hào)轉(zhuǎn)化成數(shù)字信號(hào),單片機(jī)才能夠進(jìn)行處理。

二、ADC的用途

ADC具有將模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)的能力,比如將模擬的電壓轉(zhuǎn)換成數(shù)字信號(hào),單片機(jī)進(jìn)行處理。可以用作溫度監(jiān)測(cè)或者電流監(jiān)測(cè)等方面,用途極廣。

三、STM32F103ZET6的ADC

根據(jù)中文參考手冊(cè)介紹,STM32F103ZET6單片機(jī)有3個(gè)12位ADC,共有18個(gè)通道,可測(cè)量16個(gè)外部和2個(gè)內(nèi)部信號(hào)源。各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC的結(jié)果可以左對(duì)齊或右對(duì)齊方式存儲(chǔ)在16位數(shù)據(jù)寄存器中。ADC的輸入時(shí)鐘不得超過(guò)14MHz,它是由PCLK2經(jīng)分頻產(chǎn)生。

3.1 ADC通道對(duì)應(yīng)引腳

STM32F103ZET6的ADC各通道對(duì)應(yīng)IO如下

1.jpg

2.jpg

3.2ADC時(shí)鐘

ADC輸入時(shí)鐘ADC_CLK由APB2分頻產(chǎn)生,最大值是14MHz。庫(kù)函數(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總線時(shí)鐘為72MHz,而ADC的最大工作頻率為14MHz,所以,分頻因子一般設(shè)置為6,這樣ADC的輸入時(shí)鐘頻率為12MHz。

3.3 ADC工作模式

根據(jù)中文參考手冊(cè)介紹,STM32F1的ADC有三種工作模式

  • ? 單次轉(zhuǎn)換模式 單次轉(zhuǎn)換模式下,ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過(guò)設(shè)置ADC_CR2寄存器的ADON位(只適用于規(guī)則通道)啟動(dòng)也可通過(guò)外部觸發(fā)啟動(dòng)(適用于規(guī)則通道或注入通道),這時(shí)CONT位為0。

  • ? 連續(xù)轉(zhuǎn)換模式 在連續(xù)轉(zhuǎn)換模式中,當(dāng)前面ADC轉(zhuǎn)換一結(jié)束馬上就啟動(dòng)另一次轉(zhuǎn)換。此模式可通過(guò)外部觸發(fā)啟動(dòng)或通過(guò)設(shè)置ADC_CR2寄存器上的ADON位啟動(dòng),此時(shí)CONT位是1。

  • ? 掃描模式

    33.4 ADC轉(zhuǎn)換時(shí)間

    ADC的總轉(zhuǎn)換時(shí)間與時(shí)鐘頻率有關(guān),總轉(zhuǎn)換時(shí)間 = 采樣時(shí)間 + 12.5個(gè)周期。其中,采樣時(shí)間最短為1.5個(gè)周期,也就是最短轉(zhuǎn)換時(shí)間為14個(gè)時(shí)鐘周期。使用軟件觸發(fā)時(shí),可選擇的采樣時(shí)間如下

#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后,需要對(duì)ADC進(jìn)行校準(zhǔn)。使用庫(kù)函數(shù)開(kāi)發(fā)時(shí),提供了ADC校準(zhǔn)的函數(shù)

ADC_ResetCalibration(ADC1);//重置指定的ADC的校準(zhǔn)寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));//獲取ADC重置校準(zhǔn)寄存器的狀態(tài)
    
    ADC_StartCalibration(ADC1);//開(kāi)始指定ADC的校準(zhǔn)狀態(tài)
    while(ADC_GetCalibrationStatus(ADC1));//獲取指定ADC的校準(zhǔn)程序

3.6 ADC轉(zhuǎn)換結(jié)果與實(shí)際電壓的換算

獲取到的AD轉(zhuǎn)換結(jié)果并不是實(shí)際電壓,如果想要得到實(shí)際電壓,需要經(jīng)過(guò)換算。上面介紹了,STM32的ADC為12位,也就是AD值取值范圍為0~4095。采集電壓范圍為0到3.3V。AD值與實(shí)際電壓之間存在比例關(guān)系。

實(shí)際電壓 = (AD值 / 4095) * 3.3。單位為伏特(V)

四、ADC配置步驟

  • ? 使能GPIO時(shí)鐘和ADC時(shí)鐘,設(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ù):無(wú)
 *返回值:無(wú)
 *備  注:無(wú)
 *==============================================================================
 */
void ADC1_Init(void)
{
    // 結(jié)構(gòu)體定義
    GPIO_InitTypeDef GPIO_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    
    // 開(kāi)啟時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
    
    // 設(shè)置ADC分頻因子6 72M/6=12,ADC最大時(shí)間不能超過(guò)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;   // 獨(dú)立模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;   // 非掃描模式 
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   // 關(guān)閉連續(xù)轉(zhuǎn)換
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;   // 禁止觸發(fā)檢測(cè),使用軟件觸發(fā)
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   // 右對(duì)齊 
    ADC_InitStructure.ADC_NbrOfChannel = 1;   // 1個(gè)轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1 
    ADC_Init(ADC1, &ADC_InitStructure);   // ADC初始化
    
    ADC_Cmd(ADC1, ENABLE);   // 開(kāi)啟AD轉(zhuǎn)換器
    
    // ADC校準(zhǔn)
    ADC_ResetCalibration(ADC1);   // 重置指定的ADC的校準(zhǔn)寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));   // 獲取ADC重置校準(zhǔn)寄存器的狀態(tài)
    
    ADC_StartCalibration(ADC1);   // 開(kāi)始指定ADC的校準(zhǔn)狀態(tài)
    while(ADC_GetCalibrationStatus(ADC1));   // 獲取指定ADC的校準(zhǔn)程序

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);   // 使能或者失能指定的ADC的軟件轉(zhuǎn)換啟動(dòng)功能
}

5.2 軟件觸發(fā)AD轉(zhuǎn)換

庫(kù)函數(shù)開(kāi)發(fā),配置為軟件觸發(fā)時(shí),可以通過(guò)下面的函數(shù)觸發(fā)AD轉(zhuǎn)換

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)

5.3 讀取AD轉(zhuǎn)換結(jié)果

庫(kù)函數(shù)提供了用于讀取AD轉(zhuǎn)換結(jié)果的函數(shù)

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)

這里給出另一個(gè)函數(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ù)
 *返回值:無(wú)
 *備  注:該函數(shù)配置好后,返回的結(jié)果是N次后的平均值
 *==============================================================================
 */
u16 Get_ADC_Value(u8 ch,u8 times)
{
    u32 temp_val = 0;
    u8 t;
    // 設(shè)置指定ADC的規(guī)則組通道,一個(gè)序列,采樣時(shí)間
    // ADC1,ADC通道,239.5個(gè)周期,提高采樣時(shí)間可以提高精確度
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);       
    
    for(t=0;t< times;t++)
    {
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);   // 使能指定的ADC1的軟件轉(zhuǎn)換啟動(dòng)功能 
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));   // 等待轉(zhuǎn)換結(jié)束
        temp_val+=ADC_GetConversionValue(ADC1);
        delay_ms(5);
    }
    return temp_val/times;
}

六、實(shí)戰(zhàn)項(xiàng)目

用ADC1的通道1采集某電阻兩端電壓(由于普中核心板沒(méi)有可供采集的電阻,可以直接將采集引腳接到3.3V查看一下結(jié)果),將結(jié)果通過(guò)串口打印到電腦。其中關(guān)于串口的配置就不再做介紹,給出ADC的配置和main函數(shù)。

6.1 ADC初始化

/*
 *==============================================================================
 *函數(shù)名稱:ADC1_Init
 *函數(shù)功能:初始化ADCx
 *輸入?yún)?shù):無(wú)
 *返回值:無(wú)
 *備  注:無(wú)
 *==============================================================================
 */
void ADC1_Init(void)
{
    // 結(jié)構(gòu)體定義
    GPIO_InitTypeDef GPIO_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    
    // 開(kāi)啟時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
    
    // 設(shè)置ADC分頻因子6 72M/6=12,ADC最大時(shí)間不能超過(guò)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;   // 獨(dú)立模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;   // 非掃描模式 
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   // 關(guān)閉連續(xù)轉(zhuǎn)換
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;   // 禁止觸發(fā)檢測(cè),使用軟件觸發(fā)
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   // 右對(duì)齊 
    ADC_InitStructure.ADC_NbrOfChannel = 1;   // 1個(gè)轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1 
    ADC_Init(ADC1, &ADC_InitStructure);   // ADC初始化
    
    ADC_Cmd(ADC1, ENABLE);   // 開(kāi)啟AD轉(zhuǎn)換器
    
    // ADC校準(zhǔn)
    ADC_ResetCalibration(ADC1);   // 重置指定的ADC的校準(zhǔn)寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));   // 獲取ADC重置校準(zhǔn)寄存器的狀態(tài)
    
    ADC_StartCalibration(ADC1);   // 開(kāi)始指定ADC的校準(zhǔn)狀態(tài)
    while(ADC_GetCalibrationStatus(ADC1));   // 獲取指定ADC的校準(zhǔn)程序

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);   // 使能或者失能指定的ADC的軟件轉(zhuǎn)換啟動(dòng)功能
}

6.2 main函數(shù)

u16 gAdcAdValue = 0;   // 存儲(chǔ)AD值
float gAdcVol = 0;   // 實(shí)際電壓值

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;   // 計(jì)算實(shí)際電壓
        printf ("Vol=%.1f Vrn",gAdcVol);   // 串口打印結(jié)果
        
        delay_ms (500);   // 防止打印過(guò)快
    }
}

七、拓展

7.1 定時(shí)器觸發(fā)ADC采集

根據(jù)中文參考手冊(cè)介紹,ADC可以通過(guò)定時(shí)器觸發(fā)AD轉(zhuǎn)換(只有PWM的上升沿可以觸發(fā)AD轉(zhuǎn)換)。觸發(fā)方式有以下幾種

  • ? TIM1_CH1 :定時(shí)器 1 的通道 1 的 PWM 觸發(fā)
  • ? TIM1_CH2 : 定時(shí)器 2 的通道 2 的 PWM 觸發(fā)
  • ? TIM1_CH3: 定時(shí)器 1 的通道 3 的 PWM 觸發(fā)
  • ? TIM2_CH2 : 定時(shí)器 2 的通道 2 的 PWM 觸發(fā)
  • ? TIM3_TRGO: 定時(shí)器 3 觸發(fā)
  • ? TIM4_CH4 : 定時(shí)器 4 的通道 4 的 PWM 觸發(fā)

圖片

ADC外部觸發(fā)方式

這里以TIM4的通道4觸發(fā)ADC采集為例,給出程序配置。

首先是定時(shí)器PWM的配置,不對(duì)引腳進(jìn)行重映射。

/*
 *==============================================================================
 *函數(shù)名稱:TIM4_CH4_PWM_Init
 *函數(shù)功能:初始化定時(shí)器4的PWM通道4
 *輸入?yún)?shù):per:自動(dòng)重裝載值;psc:預(yù)分頻系數(shù)
 *返回值:無(wú)
 *備  注:無(wú)
 *==============================================================================
 */
void TIM4_CH4_PWM_Init (u16 per,u16 psc)
{
    // 結(jié)構(gòu)體定義
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 開(kāi)啟時(shí)鐘
    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í)器參數(shù)
    TIM_TimeBaseInitStructure.TIM_Period = per;   // 自動(dòng)裝載值
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;   // 分頻系數(shù)
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 設(shè)置向上計(jì)數(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);   // 使能定時(shí)器
}

ADC配置程序如下,觸發(fā)源選擇TIM4的CH4,使能外部觸發(fā)。

/*
 *==============================================================================
 *函數(shù)名稱:ADC1_Init
 *函數(shù)功能:初始化ADCx
 *輸入?yún)?shù):無(wú)
 *返回值:無(wú)
 *備  注:無(wú)
 *==============================================================================
 */
void ADC1_Init(void)
{
    // 結(jié)構(gòu)體定義
    GPIO_InitTypeDef GPIO_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    
    // 開(kāi)啟時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
    
    // 設(shè)置ADC分頻因子6 72M/6=12,ADC最大時(shí)間不能超過(guò)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;   // 獨(dú)立模式
    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;   // 右對(duì)齊 
    ADC_InitStructure.ADC_NbrOfChannel = 1;   // 1個(gè)轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1 
    ADC_Init(ADC1, &ADC_InitStructure);   // ADC初始化
    
    // 使能外部觸發(fā)
    ADC_ExternalTrigConvCmd(ADC1, ENABLE);
    
    ADC_Cmd(ADC1, ENABLE);   // 開(kāi)啟AD轉(zhuǎn)換器
    
    // ADC校準(zhǔn)
    ADC_ResetCalibration(ADC1);   // 重置指定的ADC的校準(zhǔn)寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));   // 獲取ADC重置校準(zhǔn)寄存器的狀態(tài)
    
    ADC_StartCalibration(ADC1);   // 開(kāi)始指定ADC的校準(zhǔn)狀態(tài)
    while(ADC_GetCalibrationStatus(ADC1));   // 獲取指定ADC的校準(zhǔn)程序

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);   // 使能或者失能指定的ADC的軟件轉(zhuǎn)換啟動(dòng)功能
}

main函數(shù)如下

u16 gAdcAdValue = 0;   // 存儲(chǔ)AD值
float gAdcVol = 0;   // 實(shí)際電壓值

int main(void)
{
    Med_Mcu_Iint();   // 系統(tǒng)初始化
    
    while(1)
  {
        gAdcAdValue = ADC_GetConversionValue (ADC1);   // 獲取轉(zhuǎn)換結(jié)果
        gAdcVol = (gAdcAdValue / 0xFFF) * 3.3;   // 計(jì)算實(shí)際電壓
        printf ("Vol=%.1f Vrn",gAdcVol);   // 串口打印結(jié)果
        
        delay_ms (500);   // 防止打印過(guò)快
    }
}

初始化定PWM時(shí),程序?yàn)?/p>

TIM4_CH4_PWM_Init(1000,71);   // 初始化TIM4的通道4

分頻系數(shù)為71 + 1,自動(dòng)重裝載值為1000,也就是1KHz的方波,也就是觸發(fā)AD轉(zhuǎn)換的頻率為1KHz,與占空比無(wú)關(guān)。

7.2 ADC采集交流信號(hào)

ADC能夠采集的電壓范圍是0~3.3V,也就是說(shuō)負(fù)電壓無(wú)法采集。比如,需要采集下圖中的一個(gè)交流信號(hào)

圖片

交流信號(hào)圖

其位于0以下的部分是無(wú)法采集的。因此,在利用STM32采集交流信號(hào)時(shí),在交流信號(hào)輸入ADC引腳前,給交流信號(hào)增加一個(gè)直流偏置,將交流信號(hào)的最低點(diǎn)抬升到0以上,之后再輸入ADC引腳。

7.3 計(jì)算交流信號(hào)有效值

ADC可以用于電流監(jiān)測(cè),實(shí)時(shí)監(jiān)測(cè)主線路中的電流。當(dāng)然,硬件方面需要搭配電流互感線圈,通過(guò)采集互感線圈兩端的電壓,來(lái)監(jiān)測(cè)主線路電流。由于一般都是交流信號(hào),所以需要計(jì)算有效值。

根據(jù)我們所學(xué)的知識(shí),計(jì)算交流信號(hào)有效值常用兩種方法。一種是峰峰值除以根號(hào)2,另一種是計(jì)算均方根得到有效值。通常我們采用計(jì)算均方根的方法來(lái)計(jì)算有效值。因?yàn)槿绻梅宸逯党愿?hào)2去計(jì)算有效值,峰峰值很容易不準(zhǔn)確。

如果在某一個(gè)時(shí)刻,由于環(huán)境干擾或者硬件問(wèn)題,導(dǎo)致突然出現(xiàn)了一個(gè)很大的值,會(huì)導(dǎo)致計(jì)算結(jié)果與實(shí)際偏差較大。關(guān)于為什么計(jì)算均方根可以得到交流信號(hào)的有效值,這里就不做介紹了,只給出部分程序設(shè)計(jì)。由于博主目前身邊沒(méi)有合適的設(shè)備驗(yàn)證,因此僅供參考。

假設(shè)需要計(jì)算一個(gè)50Hz交流信號(hào)的的有效值,在其輸入到ADC采集引腳之前,增加一個(gè)穩(wěn)定的1.65V的偏置。ADC的采樣頻率為1KHz,也就是一個(gè)正弦波的周期可以采集20個(gè)點(diǎn)。假設(shè)采集到的AD值存儲(chǔ)到一個(gè)數(shù)組中,計(jì)算有效值的程序設(shè)計(jì)如下

int gAdcAdValue[20];   // 存儲(chǔ)采樣結(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;
        // 計(jì)算平方和
        squarSum = squarSum + gAdcAdValue[tempVar] * gAdcAdValue[tempVar];
    }
    
    // 求平均
    squarSum = squarSum / 20;
    
    // 開(kāi)根號(hào)得到均方根(有效值)
    gAdcValidValue = sqrt (squarSum);
}

在進(jìn)行程序設(shè)計(jì)時(shí)需要注意不要超出數(shù)據(jù)類型范圍。在實(shí)際應(yīng)用時(shí)肯定會(huì)存在誤差,這里也簡(jiǎn)單介紹一下誤差消除方法。目前用到的有兩種方法,第一種是分段矯正,在不同的區(qū)間內(nèi),誤差滿足線性關(guān)系時(shí)可以使用。另一種是按比例矯正,這種方法常用于誤差隨著測(cè)量值的增大而增大的情況。在計(jì)算出有效值后,減去或者加上一定比例的計(jì)算值來(lái)做矯正。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 溫度傳感器
    +關(guān)注

    關(guān)注

    48

    文章

    3033

    瀏覽量

    158424
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1278

    瀏覽量

    53694
  • 模擬數(shù)字轉(zhuǎn)換器

    關(guān)注

    1

    文章

    74

    瀏覽量

    12707
  • STM32F103ZET6
    +關(guān)注

    關(guān)注

    9

    文章

    67

    瀏覽量

    21638
  • ADC轉(zhuǎn)換
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    3795
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    為何STM32H7ADC數(shù)據(jù)不變?

    有人使用STM32H7系列的ADC模塊,定時(shí)器觸發(fā)ADC,數(shù)據(jù)通過(guò)DMA傳輸?shù)絻?nèi)存。對(duì)某通道連續(xù)轉(zhuǎn)換幾次后求個(gè)平均值。他卻發(fā)現(xiàn)ADC結(jié)果雖沒(méi)有什么問(wèn)題,但一批數(shù)據(jù)出來(lái)后就紋絲不動(dòng)了。D
    發(fā)表于 11-14 10:25 ?4497次閱讀
    為何<b class='flag-5'>STM32H7</b>的<b class='flag-5'>ADC</b>數(shù)據(jù)不變?

    STM32速成

    喲管STM32速成貼?求助
    發(fā)表于 01-23 14:34

    筆記本電腦選購(gòu)與使用常識(shí)(高手速成)

    筆記本電腦選購(gòu)與使用常識(shí)(高手速成) 專家建議,在筆記本電腦選購(gòu)時(shí),一般來(lái)講,應(yīng)該從價(jià)格、性能、質(zhì)量和服務(wù)4個(gè)方面綜合考慮
    發(fā)表于 01-20 11:51 ?841次閱讀

    筆記本屏幕測(cè)試速成

    筆記本屏幕測(cè)試速成篇   暑期的到來(lái),廣大學(xué)生朋友著實(shí)給本已經(jīng)垂死掙扎的市場(chǎng)注入了一針強(qiáng)心劑,不過(guò)今天我們討論的并不
    發(fā)表于 01-23 08:59 ?1455次閱讀

    如何在STM32中得到最佳的ADC精度

    ,用過(guò)STM32 ADC的人是不是想到了參考手冊(cè)中關(guān)于12位ADC轉(zhuǎn)換時(shí)間的公式: ST官方就如何保障或改善ADC精度寫了一篇應(yīng)用筆記AN2
    發(fā)表于 11-29 16:26 ?6.4w次閱讀
    如何在<b class='flag-5'>STM32</b>中得到最佳的<b class='flag-5'>ADC</b>精度

    STM32各模塊學(xué)習(xí)筆記

    STM32個(gè)模塊學(xué)習(xí)筆記 目錄 STM32筆記之一 中斷優(yōu)先級(jí).....................................................1
    發(fā)表于 11-30 03:32 ?3232次閱讀

    STM32ADC驅(qū)動(dòng)程序

    STM32ADC驅(qū)動(dòng)程序(電源技術(shù)被踢出核心)-? STM32ADC驅(qū)動(dòng)程序,環(huán)境是MDK,ADC的所有函數(shù)
    發(fā)表于 09-23 13:43 ?37次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>ADC</b>驅(qū)動(dòng)程序

    STM32ADC學(xué)習(xí)歷程

    STM32ADC學(xué)習(xí)歷程(電源技術(shù)期刊影響因子)-?STM32ADC學(xué)習(xí)歷程 STM32基礎(chǔ)學(xué)習(xí)歷程,幫助想學(xué)好
    發(fā)表于 09-27 12:32 ?70次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>ADC</b>學(xué)習(xí)歷程

    STM32 ADC 學(xué)習(xí)筆記

    (本文基于STM32F407)ADC功能框圖我們按框圖標(biāo)號(hào)來(lái)了解ADC1.電壓輸入范圍ADC的輸入范圍:Vref- < Vin < Vref+ (由圖中標(biāo)注的引腳決定
    發(fā)表于 11-30 10:51 ?22次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>ADC</b> 學(xué)習(xí)<b class='flag-5'>筆記</b>

    STM32CubeIDE開(kāi)發(fā)筆記7:IIC讀取MPU6050

    STM32CubeIDE開(kāi)發(fā)筆記7:IIC讀取MPU6050stm32CubeIDE所用版本:1.3.0固件庫(kù)包:f1 1.8.0測(cè)試平臺(tái)stm32
    發(fā)表于 12-06 14:06 ?9次下載
    <b class='flag-5'>STM32</b>CubeIDE開(kāi)發(fā)<b class='flag-5'>筆記</b><b class='flag-5'>7</b>:IIC讀取MPU6050

    STM32CubeMX學(xué)習(xí)筆記——STM32H743_DAC

    STM32CubeMX學(xué)習(xí)筆記——STM32H743_DACGithubSTM32CubeMX配置Pinout配置&DACADCClock Configuration配置代碼部分
    發(fā)表于 12-27 18:40 ?17次下載
    <b class='flag-5'>STM32</b>CubeMX學(xué)習(xí)<b class='flag-5'>筆記</b>——<b class='flag-5'>STM32</b>H743_DAC

    AN5354_STM32H7系列微控制器16位ADC的應(yīng)用手冊(cè)

    AN5354_STM32H7系列微控制器16位ADC的應(yīng)用手冊(cè)
    發(fā)表于 11-21 08:11 ?4次下載
    AN5354_<b class='flag-5'>STM32H7</b>系列微控制器16位<b class='flag-5'>ADC</b>的應(yīng)用手冊(cè)

    AN003 ADC 應(yīng)用筆記

    AN003 ADC 應(yīng)用筆記
    發(fā)表于 02-27 18:39 ?0次下載
    AN003 <b class='flag-5'>ADC</b> 應(yīng)用<b class='flag-5'>筆記</b>

    STM32ADC模式及其應(yīng)用

    STM32 微控制器擁有微控制器市場(chǎng)上最先進(jìn)的 ADC 之一。可以想象出有基于 STM32 ADC特性的眾多應(yīng)用。其中一些 ADC 的工作模
    發(fā)表于 08-31 10:51 ?2次下載

    STM32速成筆記(6)—定時(shí)器

    關(guān)于什么是定時(shí)器,簡(jiǎn)單來(lái)講,就是是用來(lái)定時(shí)的。STM32F103ZET6有兩個(gè)基本定時(shí)器TIM6和TIM7,四個(gè)通用定時(shí)器TIM2~TIM5和兩個(gè)高級(jí)定時(shí)器TIM1,TIM8。
    的頭像 發(fā)表于 10-24 09:41 ?5283次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>速成</b><b class='flag-5'>筆記</b>(6)—定時(shí)器
    主站蜘蛛池模板: 男人和女人在床做黄的网站 | 四虎国产精品永久在线 | 男人j进女人j的视频一进一出 | 51成人网| 亚洲黄网免费 | 狠狠狠色丁香婷婷综合激情 | 国模精品一区二区 | 最新日本免费一区二区三区中文 | 在线a人片免费观看不卡 | 国产精品色婷婷在线观看 | 天天干天天操天天爱 | 老头天天吃我奶躁我的动图 | 尤物啪啪| 操美女大逼逼 | 人人莫| 亚洲 欧美 日韩 综合 | 丁香婷婷啪啪 | 在线种子资源网 | 狠狠色狠狠色 | 1000部啪啪勿入十八免费 | 涩多多在线观看 | 久久天天躁夜夜躁狠狠85台湾 | 四虎8848精品永久在线观看 | 亚洲欧洲国产精品你懂的 | 天天色综合6 | 婷婷 综合网站 | 男人j桶进女人免费视频 | 久久久午夜影院 | 天天曰夜夜曰 | 欧美黄色片在线播放 | 女人被狂躁视频网站免费 | 日本毛片大全 | 最新久久精品 | 国产激烈无遮挡免费床戏视频 | 91精品日本久久久久久牛牛 | 亚洲爱v | 综合久久2o19| 操美女大逼逼 | 成年人午夜影院 | 欧美一欧美一区二三区性 | 久久国产精品99久久久久久牛牛 |