STM32G0开发笔记:使用ADC进行NTC温度采集

发布时间:2023-08-09  

使用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),即可得到如下所示的表格:

在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 ",adc, temp);

3 连接硬件并测试

3.1 连接硬件

按照如下图,将NTC和10K电阻连接到PA0脚:

3.2 测试

打开串口,当手放在NTC上可以看到温度变化:


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    优点是对抗混叠/抗镜像滤波器的要求得以降低,另一个优点是SNR因处理增益而提高。 Σ-Δ型ADC和DAC架构是过采样原理的终端扩展,同时也是大多数语音频带和音频信号处理数据转换器应用的首选架构。 参考......
    进行运算。 图 4 H桥功率电路原理ADC母线电压采样电路 母线电压采样电路,通过电阻分压送到芯片AD口,参与运算。 图 5 AD母线电压采样原理......
    变化的信号变成0-3.33V之间变化的信号。 如下图所示,为最基本的电阻分压采样原理图。 我使用了2K和1K电阻分压。 仿真波形如下图所示。 对上图进行完善,使用R3和C1构成低通滤波电路,用于......
    单片机如何读取0-10V传感器信号;如下图所示,使用两个电阻分压,阻值可取为2:1,分压后得到信号源1/3的电压,这样可以将0-10V之间变化的信号变成0-3.33V之间变化的信号。如下图所示,为最基本的电阻分压采样原理......
    由于励磁方向的切换,大部分时间信号未达到稳定状态,可供ADC采集流速样本的时间在励磁周期的最后10%期间,这就要求ADC有更高的数据采集速率。 图6 流量信号采样 过采样架构一般要求ADC 数据速率大于20......
    STM32的12位ADC过采样实现16位分辨率;1.什么是过采样 过采样技术是一种以牺牲采样速度来提高ADC分辨率的技术。部分STM32单片机是支持硬件过采样的,如STM32G0系列。通过过采样......
    出阻抗传感器的影响。 表3 放大器输入阻抗对流速的影响 模数转换器选择 过采样方法由于在仪表放大器的后级去掉了滤波器及增益级,信号幅值非常微弱,仅有一小部分的ADC输入范围可以使用,就需......
    通道体验快速通道Fast Channels和低速通道Slow Channels的区别,详情看本章2.12小节的电气特性。 STM32H7的ADC支持过采样,通过过采样技术可以做到26位分辨率。 ADC的专......
    -to-Digital Converter ADC原理:通过采样、量化以及编码电路,将输入的连续模拟信号变换成离散的数字信号。采样将信号在时间上离散化,量化将信号在幅度上离散化。 ▲模数转换器原理......
    STM32G4用于电机控制的外设篇(下);STM32G4上的ADC 出色的模拟-数字转换 5个ADC模块,高达42路外部输入通道 12-bit精度,硬件过采样实现16-bit精度 最高4......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>