STM32多通道ADC同时采并用DMA,外加热敏电阻(NTC)实例

2019-12-09 19:18发布

本帖最后由 快乐的小娃 于 2014-11-24 17:49 编辑

好久没有冒泡了,冒下泡表示我还活着。 。给大家分享个自己原创的NTC的例子,希望对大家有那么一点点帮助,例子很简单就是使用查表的方式在读取过来的电阻值进行比较找出当前温度,如果没有接热敏电阻会返回错误码;里面初始化了两个ADC使用来演示双通道同时采集的,但是只用了一个ADC用来举例。
  1. #include "Adc_device.h"
  2. #include "stm32f10x.h"
  3. #include "ntc_r2c.h"

  4. Adc_fun_Struct_date Adc_fun_date;//ADC保存数据

  5. void ADC_Configuration(void)
  6. {
  7.         GPIO_InitTypeDef GPIO_InitStructure;
  8.         ADC_InitTypeDef ADC_InitStructure;
  9.         DMA_InitTypeDef DMA_InitStructure;
  10.        
  11.           RCC_ADCCLKConfig(RCC_PCLK2_Div4);
  12.           /* Enable peripheral clocks ------------------------------------------------*/
  13.           /* Enable DMA1 clock */
  14.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  15.         /*------------------使能时钟---------------*/
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB |
  17.         RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1,ENABLE);       
  18.         /*----------端口配置 模拟输入模式---------*/               
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       
  21.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  22.        
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       
  25.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  26.         /*----------端口DMA1_Channel1---------*/               
  27.        

  28.   /* DMA1 channel1 configuration ----------------------------------------------*/
  29. //使用DMA的原因是比如类似温度信息这类似的辅助处理就不用麻烦CPU费心了 ,要做到分工明确,灵活应用上面的资源,不能浪费不是;俺是农民出身;
  30.   DMA_DeInit(DMA1_Channel1);
  31.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  32.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Adc_fun_date.DMA_ADC_PeripheralBaseAddr;
  33.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  34.   DMA_InitStructure.DMA_BufferSize = 200;
  35.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  36.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  37.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  38.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  39.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  40.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  41.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  42.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  43.   /* Enable DMA1 channel1 */
  44.   DMA_Cmd(DMA1_Channel1, ENABLE);
  45.   
  46.   /* ADC1 configuration ------------------------------------------------------*/
  47.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  48.   ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  49.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  50.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  51.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  52.   ADC_InitStructure.ADC_NbrOfChannel = 2;
  53.   ADC_Init(ADC1, &ADC_InitStructure);

  54.   /* ADC1 regular channel14 configuration */
  55.   ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_239Cycles5);
  56.   ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_239Cycles5);

  57.   /* Enable ADC1 DMA */
  58.   ADC_DMACmd(ADC1, ENABLE);
  59.   
  60.   /* Enable ADC1 */
  61.   ADC_Cmd(ADC1, ENABLE);

  62.   /* Enable ADC1 reset calibration register */   
  63.   ADC_ResetCalibration(ADC1);
  64.   /* Check the end of ADC1 reset calibration register */
  65.   while(ADC_GetResetCalibrationStatus(ADC1));

  66.   /* Start ADC1 calibration */
  67.   ADC_StartCalibration(ADC1);
  68.   /* Check the end of ADC1 calibration */
  69.   while(ADC_GetCalibrationStatus(ADC1));
  70.      
  71.   /* Start ADC1 Software Conversion */
  72.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  73.        
  74. }

  75. /*************************************
  76. **NTC温度转换
  77. **电压范围与电阻关系
  78. **100K        3.1518V
  79. **10K        2.2448V
  80. **1K    0.578947V
  81. **100欧姆  0.06875V
  82. ***************************************/

  83. short NTC_V2R(){       
  84.         uint32_t Temp_Value;
  85.   unsigned tmp_i;
  86.         float ADC_Value=0.00;  
  87.         float R_num=0.00;
  88.         short cc_num;                   
  89.         //算出平均值电压
  90.         for(tmp_i = 0,Temp_Value = 0;tmp_i < 100;tmp_i++){
  91.                 Temp_Value += Adc_fun_date.DMA_ADC_PeripheralBaseAddr[tmp_i][1];
  92.         }
  93.         Temp_Value /= 100;
  94.         ADC_Value = (3.3/4096)*Temp_Value - (float)Calibration_TypeDef.SOC_JZ;               
  95.         Adc_fun_date.ntc_adc_date = ADC_Value;
  96.         //算出取样点电压并推算出阻值
  97.         R_num = ADC_Value / ((3.3 - ADC_Value) / 4.7);
  98.         if(R_num > 34){
  99.                 for(tmp_i = 39;tmp_i > 0;tmp_i--){
  100.                   if(((R_num >= NTC_R_num_down[tmp_i])&&
  101.                       (R_num <= NTC_R_num_down[tmp_i-1])&&(tmp_i != 0))){          
  102.                    if((R_num - NTC_R_num_down[tmp_i]) > (NTC_R_num_down[tmp_i-1] - R_num)){
  103.                                          cc_num = -(40 - (tmp_i-1));
  104.                         return         cc_num;
  105.                          }else{
  106.                                          cc_num = -(40 - tmp_i);
  107.                         return         cc_num;
  108.                          }
  109.                   }else        if(tmp_i == 0){
  110.                                    cc_num = -50;
  111.                      return        cc_num;
  112.                   }
  113.                 }
  114.         }else if(R_num < 34){
  115.                 for(tmp_i = 1;tmp_i < 151;tmp_i++){
  116.                   if(((R_num >= NTC_R_num_top[tmp_i])&&(R_num <= NTC_R_num_top[tmp_i-1]))){         
  117.                                                                   
  118.                    if((R_num - NTC_R_num_top[tmp_i]) > (NTC_R_num_top[tmp_i-1] - R_num)){
  119.                                          cc_num = tmp_i-1;
  120.                         return         cc_num;
  121.                          }else{
  122.                                          cc_num = tmp_i;
  123.                         return         cc_num;
  124.                          }

  125.                   }else        if(tmp_i == 151){
  126.                                    cc_num = 160;
  127.                      return        cc_num;
  128.                   }
  129.                 }
  130.         }
  131. //如果到了这一步都没有出去那就说明采样失败了返回错误码203
  132.         cc_num = 203;
  133.         return         cc_num;
  134. }
复制代码

下面是头文件
#ifndef __ADC_DEVICE_H
#define __ADC_DEVICE_H
#include "stm32f10x.h"

#define ADC1_DR_Address    ((uint32_t)0x4001244C)

void ADC_Configuration(void);
short NTC_V2R(void);
float CVT_adc(void);

#pragma pack (1) /*指定按1字节对齐*/
typedef struct{
        uint16_t DMA_ADC_PeripheralBaseAddr[100][2];
        float ntc_adc_date;
        float CVT_adc_date;
}Adc_fun_Struct_date;
#pragma pack() /*取消指定对齐,恢复缺省对齐*/

#endif
         
另一个头文件
#ifndef __NTC_R2C_H
#define __NTC_R2C_H

const  float NTC_R_num_down[40] = {
352.600,//         -40          3.526E+05
329.100,//        -39          3.291E+05
307.300,//        -38          3.073E+05
287.100,//        -37          2.871E+05
268.400,//        -36          2.684E+05
251.100,//        -35          2.511E+05
235.000,//        -34          2.350E+05
220.000,//        -33          2.200E+05
206.100,//        -32          2.061E+05
193.200,//        -31          1.932E+05
181.100,//        -30          1.811E+05
169.900,//        -29          1.699E+05
159.500,//        -28          1.595E+05
149.700,//        -27          1.497E+05
140.700,//        -26          1.407E+05
132.200,//        -25          1.322E+05
124.400,//        -24          1.244E+05
117.000,//        -23          1.170E+05
110.100,//        -22          1.101E+05
103.700,//        -21          1.037E+05
97.700,//        -20          9.770E+04
92.080,//        -19          9.208E+04
86.830,//        -18          8.683E+04
81.910,//        -17          8.191E+04
77.310,//        -16          7.731E+04
72.990,//        -15          7.299E+04
68.950,//        -14          6.895E+04
65.160,//        -13          6.516E+04
61.610,//        -12          6.161E+04
58.270,//        -11          5.827E+04
55.140,//        -10          5.514E+04
52.200,//        -9          5.220E+04
49.430,//        -8          4.943E+04
46.830,//        -7          4.683E+04
44.390,//        -6          4.439E+04
42.090,//        -5          4.209E+04
39.920,//        -4          3.992E+04
37.880,//        -3          3.788E+04
35.950,//        -2          3.595E+04
34.140,//        -1          3.414E+04
};
const  float NTC_R_num_top[151] = {
32.420,//        0          3.242E+04
30.810,//        1          3.081E+04
29.290,//        2          2.929E+04
27.850,//        3          2.785E+04
26.490,//        4          2.649E+04
25.210,//        5          2.521E+04
23.990,//        6          2.399E+04
22.850,//        7          2.285E+04
21.760,//        8          2.176E+04
20.730,//        9          2.073E+04
19.760,//        10          1.976E+04
18.840,//        11          1.884E+04
17.970,//        12          1.797E+04
17.150,//        13          1.715E+04
16.370,//        14          1.637E+04
15.620,//        15          1.562E+04
14.920,//        16          1.492E+04
14.250,//        17          1.425E+04
13.620,//        18          1.362E+04
13.020,//        19          1.302E+04
12.450,//        20          1.245E+04
11.910,//        21          1.191E+04
11.400,//        22          1.140E+04
10.910,//        23          1.091E+04
10.440,//        24          1.044E+04
10.000,//        25          1.000E+04
9.579,//        26          9.579E+03
9.179,//        27          9.179E+03
8.798,//        28          8.798E+03
8.436,//        29          8.436E+03
8.090,//        30          8.090E+03
7.761,//        31          7.761E+03
7.447,//        32          7.447E+03
7.148,//        33          7.148E+03
6.863,//        34          6.863E+03
6.591,//        35          6.591E+03
6.331,//        36          6.331E+03
6.084,//        37          6.084E+03
5.848,//        38          5.848E+03
5.622,//        39          5.622E+03
5.406,//        40          5.406E+03
5.201,//        41          5.201E+03
5.004,//        42          5.004E+03
4.816,//        43          4.816E+03
4.637,//        44          4.637E+03
4.465,//        45          4.465E+03
4.301,//        46          4.301E+03
4.144,//        47           4.144E+03
3.993,//        48           3.993E+03
3.849,//        49           3.849E+03
3.711,//        50           3.711E+03
3.579,//        51           3.579E+03
3.453,//        52           3.453E+03
3.332,//        53           3.332E+03
3.216,//        54           3.216E+03
3.105,//        55           3.105E+03
2.998,//        56           2.998E+03
2.895,//        57           2.895E+03
2.797,//        58           2.797E+03
2.703,//        59           2.703E+03
2.612,//        60           2.612E+03
2.525,//        61           2.525E+03
2.441,//        62           2.441E+03
2.360,//        63           2.360E+03
2.283,//        64           2.283E+03
2.209,//        65           2.209E+03
2.137,//        66           2.137E+03
2.068,//        67           2.068E+03
2.002,//        68           2.002E+03
1.939,//        69           1.939E+03
1.877,//        70           1.877E+03
1.818,//        71           1.818E+03
1.762,//        72           1.762E+03
1.707,//        73           1.707E+03
1.654,//        74           1.654E+03
1.604,//        75           1.604E+03
1.555,//        76           1.555E+03
1.508,//        77           1.508E+03
1.463,//        78           1.463E+03
1.419,//        79           1.419E+03
1.377,//        80           1.377E+03
1.336,//        81           1.336E+03
1.297,//        82           1.297E+03
1.259,//        83           1.259E+03
1.223,//        84           1.223E+03
1.188,//        85           1.188E+03
1.154,//        86           1.154E+03
1.121,//        87           1.121E+03
1.089,//        88           1.089E+03
1.059,//        89           1.059E+03
1.029,//        90           1.029E+03
1.000,//        91           1.000E+03
0.9724,//        92           9.724E+02
0.9455,//        93           9.455E+02
0.9196,//        94           9.196E+02
0.8945,//        95           8.945E+02
0.8703,//        96           8.703E+02
0.8469,//        97           8.469E+02
0.8242,//        98           8.242E+02
0.8023,//        99           8.023E+02
0.7812,//        100   7.812E+02
0.7608,//        101   7.608E+02
0.7410,//        102   7.410E+02
0.7219,//        103   7.219E+02
0.7033,//        104   7.033E+02
0.6854,//        105   6.854E+02
0.6680,//        106   6.680E+02
0.6511,//        107   6.511E+02
0.6348,//        108   6.348E+02
0.6190,//        109   6.190E+02
0.6036,//        110   6.036E+02
0.5888,//        111   5.888E+02
0.5744,//        112   5.744E+02
0.5604,//        113   5.604E+02
0.5468,//        114   5.468E+02
0.5337,//        115   5.337E+02
0.5209,//        116   5.209E+02
0.5085,//        117   5.085E+02
0.4964,//        118   4.964E+02
0.4847,//        119   4.847E+02
0.4733,//        120   4.733E+02
0.4622,//        121   4.622E+02
0.4515,//        122   4.515E+02
0.4410,//        123   4.410E+02
0.4309,//        124   4.309E+02
0.4210,//        125   4.210E+02
0.4114,//        126   4.114E+02
0.4020,//        127   4.020E+02
0.3930,//        128   3.930E+02
0.3841,//        129   3.841E+02
0.3756,//        130   3.756E+02
0.3672,//        131   3.672E+02
0.3591,//        132   3.591E+02
0.3512,//        133   3.512E+02
0.3435,//        134   3.435E+02
0.3360,//        135   3.360E+02
0.3287,//        136   3.287E+02
0.3216,//        137   3.216E+02
0.3147,//        138   3.147E+02
0.3080,//        139   3.080E+02
0.3014,//        140   3.014E+02
0.2950,//        141   2.950E+02
0.2888,//        142   2.888E+02
0.2827,//        143   2.827E+02
0.2768,//        144   2.768E+02
0.2711,//        145   2.711E+02
0.2655,//        146   2.655E+02
0.2600,//        147   2.600E+02
0.2547,//        148   2.547E+02
0.2495,//        149   2.495E+02
0.2444//            150   2.444E+02
};       
#endif
完毕
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
48条回答
kxb
1楼-- · 2019-12-09 23:17
谢谢分享
sunjianmax232
2楼-- · 2019-12-10 05:04
多谢楼主分享。ntc表格做的那么细,难道每个温度值都标定过?
niu14789
3楼-- · 2019-12-10 07:39
 精彩回答 2  元偷偷看……
liangying
4楼-- · 2019-12-10 10:40
仔细研究下,看不太明白1
hy317
5楼-- · 2019-12-10 13:18
对齐还可以这样使用,又学到一招,谢谢
cjt5132
6楼-- · 2019-12-10 16:00
瞧一瞧,看一看

一周热门 更多>