adc.c 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "adc.h"
  2. #include "../APP/globalDef.h"
  3. void adc_init(void)
  4. {
  5. GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体
  6. ADC_InitTypeDef ADC_InitStructure; //定义ADC结构体
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //使能ADC1时钟
  9. RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6,72M/6=12,ADC最大时间不能超过14M
  10. // printf("aaaaaaaaaaaaaaaaaaaa = %x\r\n",g_firmwareMsg.gatewayMsg.hardwareMsg.data);
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置PA01
  12. if((g_firmwareMsg.gatewayMsg.hardwareMsg.data>0x20221113) \
  13. && (g_firmwareMsg.gatewayMsg.hardwareMsg.data <0x20230411)){
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//GPIO_Mode_IPD;//GPIO_Mode_AIN; //模拟输入
  15. g_runData.bRef12 = 1;
  16. }
  17. else {
  18. g_runData.bRef12 = 0;
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//GPIO_Mode_IPD;//GPIO_Mode_AIN; //模拟输入
  20. }
  21. GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA
  22. ADC_DeInit(ADC1); //复位ADC1,重设为默认缺省值
  23. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
  24. ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
  25. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
  26. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
  27. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
  28. ADC_InitStructure.ADC_NbrOfChannel = 1;
  29. ADC_InitStructure.ADC_ExternalTrigConv = 0; //顺序进行规则转换的ADC通道的数目
  30. ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1
  31. ADC_Cmd(ADC1,ENABLE); //使能ADC1
  32. ADC_ResetCalibration(ADC1); //使能复位校准
  33. while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
  34. ADC_StartCalibration(ADC1); //开启AD校准
  35. while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
  36. ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能ADC1的软件转换启动功能
  37. }
  38. u16 get_adc(uint8_t channel, uint8_t rank, uint8_t sample_time)
  39. {
  40. //配置ADCx,ADC通道,规则采样顺序,采样时间
  41. ADC_RegularChannelConfig(ADC1,channel,rank,sample_time);
  42. ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能ADC1的软件转换启动功能
  43. ADC_TempSensorVrefintCmd(ENABLE);
  44. while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束
  45. return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
  46. }
  47. #define ADC_TEST_TIMES 3
  48. int adc_test(void)
  49. {
  50. float vol=0.0;
  51. u16 temp=0, times = 0;
  52. // adc_init();
  53. times = ADC_TEST_TIMES;
  54. while(times--) {
  55. temp = get_adc(ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
  56. vol = (float)temp*3300/4096; //电压值(mV)
  57. printf("ADC_Channel_0 Voltage measurement is : %f mV(%d)\r\n",vol, temp); //串口打印电压值
  58. delay_ms(1000);
  59. }
  60. times = ADC_TEST_TIMES;
  61. while(times--) {
  62. //内部温度采样
  63. //温度 = {(V25 - VSENSE)/Avg_Slope} + 25;
  64. //其中v25 = 1.43,Avg_Slope = 0.0043
  65. //参考数据手册温度传感器电器特性一节
  66. temp = get_adc(ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
  67. vol = (1.42 - temp*3.3/4096)*1000/4.35 + 25;
  68. printf("ADC_Channel_16 Temper measurement is : %f C(%d)\r\n",vol, temp); //串口打印电压值
  69. delay_ms(1000);
  70. }
  71. times = ADC_TEST_TIMES;
  72. while(times--) {
  73. temp = get_adc(ADC_Channel_17, 1, ADC_SampleTime_239Cycles5);
  74. vol = (float)temp*3300/4096; //电压值(mV)
  75. printf("ADC_Channel_17 Voltage measurement is : %f mV(%d)\r\n",vol, temp); //串口打印电压值
  76. delay_ms(1000);
  77. }
  78. return 0;
  79. }