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.

160 lines
5.3 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. ADC_InitStruType x;
  5. GPIO_InitSettingType y;
  6. bool adccapture_error = false;
  7. static void prv_adc_pa2_init() {
  8. y.Signal = GPIO_Pin_Signal_Analog; //模拟
  9. y.Dir = GPIO_Direction_Input; //输入
  10. y.Func = GPIO_Reuse_Func0;
  11. // x.CHS设置adc采集的通道每个引脚对应一个通道
  12. GPIO_Init(GPIO_Pin_A2, &y);
  13. //经过分频以后Tadclk=1/(PCLK/4)约等于0.083us
  14. x.CLKS = ADC_CLKS_PCLK;
  15. x.CLKDIV = ADC_CLKDIV_1_32; /* ADC时钟源预分频 */
  16. //采集到的模拟量*3.3/4096=现在的电压
  17. x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,仅设置内部参考电压为多少 */
  18. x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,这个是设置adc具体是要哪个电压来做参考adc的参考电压为多少 */
  19. x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */
  20. x.CHS = ADC_CHS_AIN8;
  21. x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */
  22. //采样时间st*2+1(个Tadclk)=1.743us
  23. x.ST = 10; /* AD硬件采样时间选择 */
  24. x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */
  25. ADC_Init(&x);
  26. prv_adc_get_value();
  27. }
  28. static void prv_adc_pb8_init() {
  29. y.Signal = GPIO_Pin_Signal_Analog; //模拟
  30. y.Dir = GPIO_Direction_Input; //输入
  31. y.Func = GPIO_Reuse_Func0;
  32. // x.CHS设置adc采集的通道每个引脚对应一个通道
  33. GPIO_Init(GPIO_Pin_B8, &y);
  34. //经过分频以后Tadclk=1/(PCLK/4)约等于0.083us
  35. x.CLKS = ADC_CLKS_PCLK;
  36. x.CLKDIV = ADC_CLKDIV_1_32; /* ADC时钟源预分频 */
  37. //采集到的模拟量*3.3/4096=现在的电压
  38. x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,仅设置内部参考电压为多少 */
  39. x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,这个是设置adc具体是要哪个电压来做参考adc的参考电压为多少 */
  40. x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */
  41. x.CHS = ADC_CHS_AIN3;
  42. x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */
  43. //采样时间st*2+1(个Tadclk)=1.743us
  44. x.ST = 10; /* AD硬件采样时间选择 */
  45. x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */
  46. ADC_Init(&x);
  47. prv_adc_get_value();
  48. }
  49. static void prv_adc_pb9_init() {
  50. y.Signal = GPIO_Pin_Signal_Analog; //模拟
  51. y.Dir = GPIO_Direction_Input; //输入
  52. y.Func = GPIO_Reuse_Func0;
  53. // x.CHS设置adc采集的通道每个引脚对应一个通道
  54. GPIO_Init(GPIO_Pin_B9, &y);
  55. //经过分频以后Tadclk=1/(PCLK/32)
  56. x.CLKS = ADC_CLKS_PCLK;
  57. x.CLKDIV = ADC_CLKDIV_1_32; /* ADC时钟源预分频 */
  58. //采集到的模拟量*3.3/4096=现在的电压
  59. x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,仅设置内部参考电压为多少 */
  60. x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,这个是设置adc具体是要哪个电压来做参考adc的参考电压为多少 */
  61. x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */
  62. x.CHS = ADC_CHS_AIN4;
  63. // x.CHS = ADC_CHS_AIN8;
  64. x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */
  65. //采样时间st*2+1(个Tadclk)=1.743us
  66. x.ST = 10; /* AD硬件采样时间选择 */
  67. x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */
  68. ADC_Init(&x);
  69. prv_adc_get_value();
  70. }
  71. static float prv_adc_get_value() {
  72. ErrorStatus status = ADC_SoftStart();
  73. adccapture_error = false;
  74. if (status != SUCCESS) {
  75. adccapture_error = true;
  76. return 0;
  77. }
  78. uint32_t inticket = get_sys_ticket();
  79. while (ADC_GetConvStatus() != RESET) {
  80. if (port_haspassedms(inticket) > 10) {
  81. // printf("prv_adc_get_value ch:%d\n", x.CHS);
  82. // printf("fail\n", x.CHS);
  83. adccapture_error = true;
  84. return 0;
  85. }
  86. }
  87. // printf("success %d\n", port_haspassedms(inticket));
  88. uint16_t adcv = ADC_GetConvValue();
  89. ADC_SoftStop();
  90. // printf("success\n", x.CHS);
  91. // printf("%d\r\n", adcv);
  92. return adcv * 3.3 / 4096;
  93. }
  94. static float prv_adc_get_value_average(int average) {
  95. if (average == 0) {
  96. average = 1;
  97. }
  98. float value = 0;
  99. for (size_t i = 0; i < average; i++) {
  100. value += prv_adc_get_value();
  101. }
  102. return value / average;
  103. }
  104. float adc_get_value_pa2(void) {
  105. prv_adc_pa2_init();
  106. return prv_adc_get_value_average(AVERAGE_TABLE_SIZE);
  107. }
  108. float adc_get_value_pb8(void) {
  109. prv_adc_pb8_init();
  110. return prv_adc_get_value_average(AVERAGE_TABLE_SIZE);
  111. }
  112. float adc_get_value_pb9(void) {
  113. prv_adc_pb9_init();
  114. return prv_adc_get_value_average(AVERAGE_TABLE_SIZE);
  115. }
  116. float adc_get_value_pa2_filter(float factor) {
  117. static float last = 0;
  118. float now_raw = adc_get_value_pa2();
  119. if (adccapture_error) {
  120. return last;
  121. }
  122. float now = ((float)last * (1.0f - factor)) + ((float)now_raw * factor);
  123. last = now;
  124. return now;
  125. }
  126. float adc_get_value_pb8_filter(float factor) {
  127. static float last = 0;
  128. float now_raw = adc_get_value_pb8();
  129. if (adccapture_error) {
  130. return last;
  131. }
  132. float now = ((float)last * (1.0f - factor)) + ((float)now_raw * factor);
  133. last = now;
  134. return now;
  135. }
  136. float adc_get_value_pb9_filter(float factor) {
  137. static float last = 0;
  138. float now_raw = adc_get_value_pb9();
  139. if (adccapture_error) {
  140. return last;
  141. }
  142. float now = ((float)last * (1.0f - factor)) + ((float)now_raw * factor);
  143. last = now;
  144. return now;
  145. }