<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/nb-iot) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> ## **ADC理論基礎** * **模擬信號**:模擬信號是指用連續變化的物理量所表達的信息,特點是信號值的變化是連續的,如下圖所示。 ![](https://img.kancloud.cn/a7/64/a76403f5bbbe0fc46e82220c61b69ada_900x572.png =300x) ### * **數字信號**:數字信號是指用一系列斷續變化的脈沖數字量所表達的信息,特點是信號值會特然變化,如下圖所示。 ![](https://img.kancloud.cn/5d/3d/5d3d4ee4d36e4ee98f1399bae4fcd866_570x362.png =300x) ### * **ADC**:即模數轉換,指模擬信號轉換為數字信號的過程。舉個例子,例如下圖中的黑色線為一個模擬信號,可以通過特定的規則或者算法將其轉換為階梯狀的數字信號。 ![](https://img.kancloud.cn/c1/c1/c1c1aeb3b42ae9bb643bcafa93911372_562x326.png =400x) <br/> &emsp;&emsp;本節課將會以STM32F030的PA0這個IO口作為模擬信號的輸入口,然后把這個模擬信號轉換為數字信號。 <br/> ## **ADC 的 HCL API 設計** ADC的HAL API比較簡單,只需要初始化和讀取數據的API即可,如圖所示。 ![](https://img.kancloud.cn/95/b3/95b367856bdb569f8d75c49afea3017f_364x180.png) <br/> ## **編寫代碼** 筆者在本節課配套的源代碼中新建了 hal\_adc.h 和 hal\_adc.c文件,如圖所示。 ![](https://img.kancloud.cn/3d/5b/3d5b575a52e50d56979ba747c510783d_266x592.png) ### 打開本節課配套的工程,筆者把hal\_adc.c以及必要的標準庫文件添加進工程了,如圖所示。 ![](https://img.kancloud.cn/4c/18/4c18cd4d0d5a30526d231f23384abe46_375x661.png =300x) <br/> hal_adc.h文件的代碼如下: ``` #ifndef __HAL_ADC_H__ #define __HAL_ADC_H__ /* *初始化ADC */ void halAdcInit(void); /* *讀取ADC值 */ unsigned int halAdcRead(void); #endif /* __HAL_ADC_H__ */ ``` <br/> hal_adc.c文件代碼如下: ``` #include "hal_adc.h" #include "stm32f0xx_adc.h" /* *初始化ADC */ void halAdcInit() { GPIO_InitTypeDef gpioCfg;//定義GPIO配置 ADC_InitTypeDef adcCfg;//定義ADC配置 /* 配置PA0 */ gpioCfg.GPIO_Pin = GPIO_Pin_0;//指定引腳為Pin 0 gpioCfg.GPIO_Mode = GPIO_Mode_AN; gpioCfg.GPIO_PuPd = GPIO_PuPd_NOPULL; /* 配置ADC */ adcCfg.ADC_Resolution = ADC_Resolution_12b;//ADC值的分辨率為12位 adcCfg.ADC_ContinuousConvMode = DISABLE;//不要進行持續的轉換。在halAdcRead函數每次讀取ADC值時,會重新啟動轉換過程 adcCfg.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; adcCfg.ADC_DataAlign = ADC_DataAlign_Right; adcCfg.ADC_ScanDirection = ADC_ScanDirection_Backward; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4); ADC_DeInit(ADC1); GPIO_Init(GPIOA, &gpioCfg);//初始化PA0 ADC_Init(ADC1, &adcCfg);//初始化ADC1 /* Convert the ADC1 Vref with 55.5 Cycles as sampling time */ ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_55_5Cycles); ADC_GetCalibrationFactor(ADC1); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); ADC_StartOfConversion(ADC1); } /* *讀取ADC值 * *@return ADC值 */ unsigned int halAdcRead() { ADC_StartOfConversion(ADC1); while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); } ``` <br/> ## **使用ADC HAL API** 編寫好ADC HAL API后,ADC的使用非常簡單。在配套工程的main.c文件中添加如下代碼: ### ``` /* * 通過串口接收到信息時的回調函數 * @param byte - 接收到的數據 */ static void onUartIRQ(unsigned char byte) {} int main(void) { halSystemInit();//系統初始化 halUartInit(115200);//串口通信初始化,并設置波特率為115200 halUartSetIRQCallback(onUartIRQ);//注冊串口通信回調函數,當通過串口接收到信息時自動調用此函數 halAdcInit();//ADC初始化 /* 每隔1秒讀取一次ADC值并通過串口發送出去 */ while (1) { halSystemDelayUs(1000 * 1000);//延時1000*1000微秒,即1秒 char debug[32]; sprintf(debug, "ADC=%d\n", halAdcRead());//讀取ADC值,并格式化保存到debug變量中 halUartWrite((uint8_t *)debug, strlen(debug));//把debug通過串口發送出去 } } ``` ### 上述代碼使用了格式化函數sprintf和字符串長度計算函數strlen,這兩個函數在以下頭文件中: ### ``` #include <stdio.h> #include <string.h> ``` <br/> **代碼測試** 1.編譯鏈接工程代碼,把生成的Hex文件燒錄到開發板中。 ### 2.把開發板的撥碼開關的第1~4位打到右邊,第5、6位打到左邊,如圖所示。 ![](https://img.kancloud.cn/58/9a/589a66f16f8ca111d36b54fac452805c_1076x1045.png =250x) 接著,使用配套的Micro USB線連接開發板到電腦上。 ### 3.然后打開串口調試助手,并按照《串口通信實驗》章節的說明做好相關配置。 ### 4.讀者可以看到由PA0這個IO口輸入的模擬信號經過ADC后的值,如圖所示。 ![](https://img.kancloud.cn/1f/a2/1fa24b52c1ab54f10e08701cd18d797b_725x723.png =500x) <br/> **進一步解釋** 在《GPIO實驗:按鍵》章節曾經講解過,STM32F030的PA0是與一個名為“User”的按鍵連接的,如圖所示。 ![](https://img.kancloud.cn/d6/5b/d65b0eade5a60e99322ca3538044ccf8_1786x988.png =500x) ### * 按鍵沒有被按下時,PA0為浮空輸入,即PA0的輸入電平是不確定的。 * 按鍵被按下后,PA0連接3v3的電源,因此PA0的輸入電平是3v3。 也就是說,PA0將會輸入0~3.3v的模擬信號。main函數中的halAdcRead()函數作用是讀取當前的模擬信號值,然后把這個值映射到[0,4095]這個范圍中,例如: * 如果讀取到的模擬信號值為3.3v左右,那么halAdcRead()函數的返回值為4095左右; * 如果讀取到的模擬信號值為0v左右,那么halAdcRead()函數的返回值為0左右; * 如果讀取到的模擬信號值為1.65v左右,那么halAdcRead()函數的返回值為2047左右。 ### [0,4095]這個取值范圍是由ADC初始化函數halAdcInit()中的以下配置決定的: ``` adcCfg.ADC_Resolution = ADC_Resolution_12b;//ADC值的分辨率為12位 ``` 讀者也可以把分辨率設置為8位,此時的取值范圍即為[0,255],對應的配置代碼如下: ``` adcCfg.ADC_Resolution = ADC_Resolution_8b;//ADC值的分辨率為8位 ``` <br/> **進一步擴展** 在ADC初始化函數halAdcInit()中,筆者使用了PA0作為模擬信號的輸入接口,讀者也可以更改其中的配置來使用其它GPIO作為輸入接口。 <br/> <br/> ## **商務合作** 如有以下需求,可掃碼添加管理員好友,注明“**商務合作**” * 項目定制開發,技術范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等; * 入駐平臺,成為講師; * 接項目賺外快; * 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/b7/5a/b75ac8c3da945f20568771f5935c388f_430x430.png =150x) (非商務合作**勿擾**,此處**非**技術支持)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看