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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32G0開發筆記:使用ADC進行NTC溫度采集

CHANBAEK ? 來源:電子技術攻城獅 ? 作者: MakerInChina.cn ? 2023-01-16 15:12 ? 次閱讀

使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下使用ADC進行NTC溫度采集。

1 新建項目

  • 建立ntc_temp項目

PIO的Home頁面新建項目,項目名稱ntc_temp,選擇開發板為 MonkeyPi_STM32_G070RB,開發框架選擇libopencm3;

  • 項目建立完成后在src目錄下新建main.c主程序文件;
  • 修改下載和調試方式,這里開發板使用的是DAPLink仿真器,因此修改platformio.ini文件如下:
1upload_protocol = cmsis-dap
2debug_tool = cmsis-dap
  • 為了能使用printf的浮點功能,可以加入如下配置:
1build_flags = 
2    -Wl,-u,_printf_float

2 編寫程序

2.1 ADC設置
1void adc_setup()
 2{
 3    rcc_periph_clock_enable(RCC_GPIOA);
 4    rcc_periph_clock_enable(RCC_ADC);
 5
 6    gpio_mode_setup(GPIOA,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO0);
 7
 8    adc_power_off(ADC1);
 9    adc_set_clk_prescale(ADC1,ADC_CCR_PRESC_DIV2);
10    adc_set_single_conversion_mode(ADC1);
11    adc_set_right_aligned(ADC1);
12    adc_set_sample_time_on_all_channels(ADC1,ADC_SMPTIME_160DOT5);
13    uint8_t channel = 0;
14    adc_set_regular_sequence(ADC1,1,&channel);
15    adc_set_resolution(ADC1,ADC_CFGR1_RES_12_BIT);
16
17    adc_power_on(ADC1);
18
19    delay_ms(10);
20
21}

ADC設置按照之前文章介紹的方法設置PA0為ADC輸入;

2.2 ADC讀取
1uint16_t adc_sample()
2{
3    adc_start_conversion_regular(ADC1);
4    return adc_read_regular(ADC1);
5}
2.3 ADC與NTC的溫度轉換
  • 首先根據所選的NTC規格的溫度-電阻對應表得到其ADC值的關系表:

這里的NTC分壓電阻為10K,ADC分辨率為12位,因此ADC采集值為:(NTC電阻 x 4095) ÷ (NTC電阻 + 10K),即可得到如下所示的表格:

image-20220926234050183

在EXCEL中計算出ADC采樣數值-溫度對應表,為了簡單ADC進行取整,就可以得到電阻-55到125攝氏度的ADC對應表:

1const uint16_t ntcDATA[] = {
 24040,4038,4035,4031,4027,4023,4018,4013,4007,4001,3994,3987,3980,3972,3964,3956,
 3
 43947,3937,3928,3917,3907,3896,3884,3872,3860,3847,3833,3819,3804,3789,3773,3757,
 5
 63740,3722,3703,3684,3664,3644,3622,3600,3577,3553,3528,3502,3475,3448,3419,3390,
 7
 83360,3329,3297,3264,3230,3195,3160,3123,3086,3048,3010,2970,2930,2889,2848,2806,
 9
102763,2720,2676,2633,2588,2544,2499,2454,2408,2363,2317,2272,2226,2181,2136,2091,
11
122048,2001,1957,1913,1869,1826,1783,1741,1699,1658,1617,1576,1537,1498,1459,1422,
13
141385,1348,1312,1277,1243,1209,1176,1144,1112,1081,1051,1022,993,965,937,910,
15
16884,859,834,810,786,764,741,720,699,679,659,639,621,602,585,568,
17
18551,535,519,504,490,475,461,448,435,422,410,398,387,376,365,355,
19
20345,335,325,316,307,299,290,282,274,267,259,252,245,239,232,226,
21
22220,214,208,202,197,192,187,182,177,172,168,163,159,155,151,146,
23
24143,139,135,132,129
25};
  • 然后根據表格獲取溫度,即每個ADC對應的索引即為溫度值,如4040為索引0,對應第一個溫度-55℃;
  • 表格中數據是有序的,因此這里可以使用二分法查找,對于兩個數中間值則取其相近的那個值:
1#define TEMP_HEADER_VALUE   -55 //the first temp in table
 2
 3#define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
 4
 5/**
 6 * @brief search the table, return a midium value if not found
 7 * 
 8 * @param table  the data to search
 9 * @param len    the table length
10 * @param up    if data is min to max
11 * @return int32_t -1 -> if not found
12 */
13int32_t bsearch_ret_mid(const uint16_t *table, uint16_t len, bool up, uint16_t key)
14{
15    uint16_t bot;
16    uint16_t mid;
17    uint16_t check;
18    uint16_t top;
19
20    if (len == 0) {
21        return -1;
22    }
23
24    if (up) {
25        //the first data will be min
26        if (key < table[0]) {
27            return -1;
28        }
29
30        //bigger then the last data
31        if (key > table[len - 1]) {
32            return -1;
33        }
34    } else {
35        if (key > table[0]) {
36            return -1;
37        }
38
39        if (key < table[len - 1]) {
40            return -1;
41        }
42    }
43
44    bot = 0;
45    top = len - 1;
46
47    if (up) {
48        while (bot < top) {
49            mid = top - (top - bot) / 2;
50
51            if (key < table[mid]) {
52                top = mid - 1;
53            } else {
54                bot = mid;
55            }
56        }
57    } else {
58        while (bot < top) {
59            mid = top - (top - bot) / 2;
60
61            if (key > table[mid]) {
62                top = mid - 1;
63            } else {
64                bot = mid;
65            }
66        }
67    }
68
69    if (key == table[top]) {
70        return top;
71    }
72
73    //not equal the data in table
74    if (up) {
75        if (key > table[top]) {
76            return top;
77        }
78    } else {
79        if (key < table[top]) {
80            return top;
81        }
82    }
83
84    return -1;
85}
  • 然后根據索引得到溫度:
1//get temperature , x10
 2int16_t ntc2tem(uint16_t adc)
 3{
 4    int32_t  index = 0;
 5    int16_t temperature = 0;
 6
 7    index = bsearch_ret_mid(ntcDATA, ITEM_NUM(ntcDATA),false,adc);
 8
 9    //max, the first value
10    if(index==0){
11        temperature = TEMP_HEADER_VALUE*10;
12    }
13    //min, the last value
14    else if(index>= ITEM_NUM(ntcDATA)){
15        temperature = 10*(TEMP_HEADER_VALUE + ITEM_NUM(ntcDATA));
16    }
17    else{
18        //just get integer number
19        // temperature = TEMP_HEADER_VALUE + index;
20
21        //get approximation data
22        temperature = TEMP_HEADER_VALUE + index;
23
24        //at middle
25        temperature = (temperature+1)*10 - 10.0 * (adc-ntcDATA[index+1])/(ntcDATA[index]-ntcDATA[index+1]);
26    }
27
28    return temperature;
29
30}

表格中的溫度是1度進行變化的,如果需要稍微精確的,這里在1度中間的值近似看做線性進行計算;

這里為了減小計算誤差,先對其擴大十倍計算,顯示時候再轉為小數:

1uint16_t adc = adc_sample();
2
3int16_t temp_int = ntc2tem(adc);
4float temp = temp_int/10.0;
5
6printf("adc: %d, temp: %.1f\\r\\n",adc, temp);

3 連接硬件并測試

3.1 連接硬件

按照如下圖,將NTC和10K電阻連接到PA0腳:

image-20220926233017743

3.2 測試

打開串口,當手放在NTC上可以看到溫度變化:

image-20220926232610018

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • NTC
    NTC
    +關注

    關注

    7

    文章

    449

    瀏覽量

    52653
  • adc
    adc
    +關注

    關注

    99

    文章

    6609

    瀏覽量

    547678
  • 仿真器
    +關注

    關注

    14

    文章

    1027

    瀏覽量

    84629
  • 開發板
    +關注

    關注

    25

    文章

    5379

    瀏覽量

    100699
  • STM3
    +關注

    關注

    0

    文章

    5

    瀏覽量

    9005
收藏 0人收藏
  • ben1111
  • 小疯子小张12401

評論

相關推薦

AN5096_介紹STM32G0系列硬件開發

AN5096_介紹STM32G0系列硬件開發
發表于 11-21 08:11 ?4次下載
AN5096_介紹<b class='flag-5'>STM32G0</b>系列硬件<b class='flag-5'>開發</b>

STM32G0開發筆記:FreeRTOS和FreeModbus庫使用

使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為FreeRTOS和FreeModbus庫使用。
的頭像 發表于 01-16 14:44 ?6493次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:FreeRTOS和FreeModbus庫使用

STM32G0開發筆記:FreeRTOS和CLI組件使用

使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為FreeRTOS和CLI組件使用。
的頭像 發表于 01-16 14:47 ?4234次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:FreeRTOS和CLI組件使用

STM32G0開發筆記:使用FreeRTOS系統的隊列Queue

使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面為使用FreeRTOS系統的隊列Queue。
的頭像 發表于 01-16 14:50 ?1665次閱讀

STM32G0開發筆記:使用FreeRTOS系統

使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面為使用FreeRTOS系統。
的頭像 發表于 01-16 15:07 ?2778次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:使用FreeRTOS系統

STM32G0開發筆記:用PWM來實現LED呼吸燈效果

使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面使用PWM來實現LED呼吸燈效果。
的頭像 發表于 01-16 15:15 ?2573次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:用PWM來實現LED呼吸燈效果

STM32G0開發筆記:EEPROM M24C02的使用方法

使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為EEPROM M24C02的使用方法。
的頭像 發表于 01-16 15:19 ?3238次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:EEPROM M24C02的使用方法

STM32G0開發筆記:SD卡模塊的使用方法

使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面介紹SD卡模塊的使用方法。
的頭像 發表于 01-19 16:27 ?2704次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:SD卡模塊的使用方法

STM32G0開發筆記:SPI接口的基本使用

使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面介紹SPI接口的基本使用。
的頭像 發表于 01-17 10:38 ?3497次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:SPI接口的基本使用

STM32G0開發筆記:多通道ADC與DMA的使用

使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為多通道ADC與DMA的使用。
的頭像 發表于 01-17 10:41 ?7663次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:多通道<b class='flag-5'>ADC</b>與DMA的使用

STM32G0開發筆記:定時器timer的基本使用方法

使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為定時器timer的基本使用方法。
的頭像 發表于 01-17 10:43 ?4149次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:定時器timer的基本使用方法

STM32G0開發筆記:串口中斷的使用

使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為串口中斷的使用。
的頭像 發表于 01-17 10:46 ?2677次閱讀

STM32G0開發筆記:GPIO接按鍵的使用方式

使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面為GPIO接按鍵的使用方式。
的頭像 發表于 01-17 10:48 ?1998次閱讀

STM32G0開發筆記:LED燈示例

使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面為LED燈示例。
的頭像 發表于 01-17 10:52 ?1633次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:LED燈示例

STM32G0開發筆記:使用libopencm3庫

使用Platformio平臺的libopencm3開發框架來開發STM32G0,開發環境為VSCode+PIO插件,這里以開發
的頭像 發表于 01-17 10:56 ?2268次閱讀
<b class='flag-5'>STM32G0</b><b class='flag-5'>開發筆記</b>:使用libopencm3庫

電子發燒友

中國電子工程師最喜歡的網站

  • 2931785位工程師會員交流學習
  • 獲取您個性化的科技前沿技術信息
  • 參加活動獲取豐厚的禮品
主站蜘蛛池模板: 免费播放视频 | 日本a级在线| 99久久久免费精品免费 | 欧美一级在线观看播放 | 在线观看精品国产入口 | 钻石午夜影院 | 日本全黄视频 | 高清视频黄色录像免费 | 视频1区| 免费观看a黄一级视频 | 日本黄色大片免费 | 五月天婷婷伊人 | 天天做天天摸天天爽天天爱 | 亚洲 丝袜 制服 欧美 另类 | 日韩欧美理论 | 理论视频在线观看 | 国产黄色网页 | 男女吃奶一进一出动态图 | 在线免费观看毛片网站 | 把小嫩嫩曰出白浆 | 久久免费福利视频 | 丁香六月啪啪 | 天天看天天摸色天天综合网 | 色综合色狠狠天天综合色hd | 国产一区二区丁香婷婷 | 国产精品美女久久久久网站 | 一级特黄特色的免费大片视频 | 香蕉爱爱网 | 久久青草国产免费观看 | 国产三级国产精品国产普男人 | 91午夜剧场| 色婷婷社区 | 午夜精品影院 | qyule亚洲精品 | 97天天干 | 国内精品视频免费观看 | 色之综综 | 嗯!啊!使劲用力在线观看 | 黄a在线 | 免费不卡毛片 | 5252色欧美在线激情 |