You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
4.1 KiB

4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
  1. #include "adc.h"
  2. static float prv_adc_get_value();
  3. // uint16_t meanvalue;
  4. static void prv_adc_pa2_init() {
  5. ADC_InitStruType x;
  6. GPIO_InitSettingType y;
  7. y.Signal = GPIO_Pin_Signal_Analog; //模拟
  8. y.Dir = GPIO_Direction_Input; //输入
  9. y.Func = GPIO_Reuse_Func0;
  10. // x.CHS设置adc采集的通道每个引脚对应一个通道
  11. GPIO_Init(GPIO_Pin_A2, &y);
  12. //经过分频以后Tadclk=1/(PCLK/4)约等于0.083us
  13. x.CLKS = ADC_CLKS_PCLK;
  14. x.CLKDIV = ADC_CLKDIV_1_32; /* ADC时钟源预分频 */
  15. //采集到的模拟量*3.3/4096=现在的电压
  16. x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,仅设置内部参考电压为多少 */
  17. x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,这个是设置adc具体是要哪个电压来做参考adc的参考电压为多少 */
  18. x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */
  19. x.CHS = ADC_CHS_AIN8;
  20. x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */
  21. //采样时间st*2+1(个Tadclk)=1.743us
  22. x.ST = 10; /* AD硬件采样时间选择 */
  23. x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */
  24. ADC_Init(&x);
  25. prv_adc_get_value();
  26. }
  27. static void prv_adc_pb8_init() {
  28. ADC_InitStruType x;
  29. GPIO_InitSettingType y;
  30. y.Signal = GPIO_Pin_Signal_Analog; //模拟
  31. y.Dir = GPIO_Direction_Input; //输入
  32. y.Func = GPIO_Reuse_Func0;
  33. // x.CHS设置adc采集的通道每个引脚对应一个通道
  34. GPIO_Init(GPIO_Pin_B8, &y);
  35. //经过分频以后Tadclk=1/(PCLK/4)约等于0.083us
  36. x.CLKS = ADC_CLKS_PCLK;
  37. x.CLKDIV = ADC_CLKDIV_1_32; /* ADC时钟源预分频 */
  38. //采集到的模拟量*3.3/4096=现在的电压
  39. x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,仅设置内部参考电压为多少 */
  40. x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,这个是设置adc具体是要哪个电压来做参考adc的参考电压为多少 */
  41. x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */
  42. x.CHS = ADC_CHS_AIN3;
  43. x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */
  44. //采样时间st*2+1(个Tadclk)=1.743us
  45. x.ST = 10; /* AD硬件采样时间选择 */
  46. x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */
  47. ADC_Init(&x);
  48. prv_adc_get_value();
  49. }
  50. static void prv_adc_pb9_init() {
  51. ADC_InitStruType x;
  52. GPIO_InitSettingType y;
  53. y.Signal = GPIO_Pin_Signal_Analog; //模拟
  54. y.Dir = GPIO_Direction_Input; //输入
  55. y.Func = GPIO_Reuse_Func0;
  56. // x.CHS设置adc采集的通道每个引脚对应一个通道
  57. GPIO_Init(GPIO_Pin_B9, &y);
  58. //经过分频以后Tadclk=1/(PCLK/32)
  59. x.CLKS = ADC_CLKS_PCLK;
  60. x.CLKDIV = ADC_CLKDIV_1_32; /* ADC时钟源预分频 */
  61. //采集到的模拟量*3.3/4096=现在的电压
  62. x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,仅设置内部参考电压为多少 */
  63. x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,这个是设置adc具体是要哪个电压来做参考adc的参考电压为多少 */
  64. x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */
  65. x.CHS = ADC_CHS_AIN4;
  66. // x.CHS = ADC_CHS_AIN8;
  67. x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */
  68. //采样时间st*2+1(个Tadclk)=1.743us
  69. x.ST = 10; /* AD硬件采样时间选择 */
  70. x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */
  71. ADC_Init(&x);
  72. prv_adc_get_value();
  73. }
  74. static float prv_adc_get_value() {
  75. ADC_SoftStart();
  76. while (ADC_GetConvStatus() != RESET)
  77. ;
  78. uint16_t adcv = ADC_GetConvValue();
  79. ADC_SoftStop();
  80. printf("%d\r\n", adcv);
  81. return adcv * 3.3 / 4096;
  82. }
  83. static float prv_adc_get_value_average(int average) {
  84. if (average == 0) {
  85. average = 1;
  86. }
  87. float value = 0;
  88. for (size_t i = 0; i < average; i++) {
  89. value += prv_adc_get_value();
  90. }
  91. return value / average;
  92. }
  93. float adc_get_value_pa2(void) {
  94. prv_adc_pa2_init();
  95. return prv_adc_get_value_average(AVERAGE_TABLE_SIZE);
  96. }
  97. float adc_get_value_pb8(void) {
  98. prv_adc_pb8_init();
  99. return prv_adc_get_value_average(AVERAGE_TABLE_SIZE);
  100. }
  101. float adc_get_value_pb9(void) {
  102. prv_adc_pb9_init();
  103. return prv_adc_get_value_average(AVERAGE_TABLE_SIZE);
  104. }