bsp_adc.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*********************************************************************
  2. * INCLUDES
  3. */
  4. #include "bsp_adc.h"
  5. #include "system.h"
  6. /*********************************************************************
  7. * DEFINITIONS
  8. */
  9. #define CHANNEL_MAX 4
  10. #define PIN_NOT_USED 0xFF
  11. #define CHANNEL_NOT_USED 0xFF
  12. #define WAIT_TIME_VALUE 3 // 等待超时最大值
  13. /*********************************************************************
  14. * STRUCTION
  15. */
  16. typedef struct {
  17. uint32_t pin;
  18. uint32_t channel;
  19. }adc_config_t;
  20. /*********************************************************************
  21. * LOCAL VARIABLES
  22. */
  23. static adc_config_t m_adc_config[CHANNEL_MAX] = {{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED},{PIN_NOT_USED,CHANNEL_NOT_USED}};
  24. static nrf_saadc_channel_config_t channelConfig[CHANNEL_MAX];
  25. static nrf_saadc_value_t s_bufferPool[CHANNEL_MAX] = {0};
  26. static volatile bool adc_SampleOk = true; // adc采集完成标志
  27. //定义SAADC采样数据缓存
  28. //定义SAADC采样缓存数组大小
  29. //只有采样结果存满该缓存之后,才会产生SAADC采样完成事件
  30. static uint32_t sample_in_buffer = 0;
  31. /*********************************************************************
  32. * LOCAL FUNCTIONS
  33. */
  34. /**
  35. @brief ADC中断处理回调函数
  36. @param 无
  37. @return 无
  38. */
  39. static void adcCallbackFunc(nrf_drv_saadc_evt_t const *pEvent)
  40. {
  41. ret_code_t err_code;
  42. if(pEvent->type == NRF_DRV_SAADC_EVT_DONE) // 采样完成,采集时填充顺序为,通道编号小的先填充。
  43. {
  44. //设置好缓存,为下一次采样做准备
  45. err_code=nrf_drv_saadc_buffer_convert(pEvent->data.done.p_buffer,sample_in_buffer);
  46. APP_ERROR_CHECK(err_code);
  47. adc_SampleOk = true;
  48. }
  49. }
  50. /**
  51. @brief 初始化ADC
  52. @param 无
  53. @return 无
  54. */
  55. static void ADC_Init(void)
  56. {
  57. ret_code_t errCode;
  58. // ADC初始化
  59. errCode = nrf_drv_saadc_init(NULL, adcCallbackFunc);//优先级设置为3,比定时器中断要高,不然回调会在定时器中断结束后触发。
  60. APP_ERROR_CHECK(errCode);
  61. // ADC通道配置
  62. for(int i=0;i<CHANNEL_MAX;i++)
  63. {
  64. if(m_adc_config[i].pin != PIN_NOT_USED && m_adc_config[i].channel != CHANNEL_NOT_USED)
  65. {
  66. //设置ADC引脚为浮空
  67. nrf_gpio_cfg_input(m_adc_config[i].pin,NRF_GPIO_PIN_NOPULL);
  68. // 单端输入
  69. channelConfig[m_adc_config[i].channel].resistor_p = NRF_SAADC_RESISTOR_DISABLED;
  70. channelConfig[m_adc_config[i].channel].resistor_n = NRF_SAADC_RESISTOR_DISABLED;
  71. channelConfig[m_adc_config[i].channel].gain = NRF_SAADC_GAIN1_6;
  72. channelConfig[m_adc_config[i].channel].reference = NRF_SAADC_REFERENCE_INTERNAL;
  73. channelConfig[m_adc_config[i].channel].acq_time = NRF_SAADC_ACQTIME_10US;
  74. channelConfig[m_adc_config[i].channel].mode = NRF_SAADC_MODE_SINGLE_ENDED;
  75. channelConfig[m_adc_config[i].channel].burst = NRF_SAADC_BURST_DISABLED;
  76. channelConfig[m_adc_config[i].channel].pin_p = (nrf_saadc_input_t)(m_adc_config[i].channel + 1);
  77. channelConfig[m_adc_config[i].channel].pin_n = NRF_SAADC_INPUT_DISABLED;
  78. // ADC通道初始化
  79. errCode = nrf_drv_saadc_channel_init(m_adc_config[i].channel, &channelConfig[m_adc_config[i].channel]);
  80. APP_ERROR_CHECK(errCode);
  81. sample_in_buffer++;
  82. }
  83. }
  84. if(sample_in_buffer > 0)
  85. {
  86. // 缓冲配置
  87. errCode = nrf_drv_saadc_buffer_convert(s_bufferPool, sample_in_buffer);
  88. APP_ERROR_CHECK(errCode);
  89. }
  90. }
  91. static void cb_adcWakeup(uint32_t t)
  92. {
  93. ADC_Enable();
  94. }
  95. static void cb_adcSleep(uint32_t t)
  96. {
  97. ADC_Disable();
  98. }
  99. /*********************************************************************
  100. * PUBLIC FUNCTIONS
  101. */
  102. /**
  103. @brief 初始化ADC引脚和通道
  104. @param pin -[in] 需要初始化的adc引脚
  105. @param channel -[in] 需要初始化的adc通道
  106. @return 错误代码
  107. */
  108. uint32_t ADC_SetPinChannel(uint32_t pin, uint32_t channel)
  109. {
  110. for(int i=0;i<CHANNEL_MAX;i++)
  111. {
  112. if(m_adc_config[i].pin == pin)return ADC_ERR_INIT_PIN;
  113. if(m_adc_config[i].channel == channel)return ADC_ERR_INIT_CHANNEL;
  114. if(PIN_NOT_USED != pin && m_adc_config[i].pin == PIN_NOT_USED)
  115. {
  116. m_adc_config[i].pin = pin;
  117. m_adc_config[i].channel = channel;
  118. return ADC_OP_SUCCESS;
  119. }
  120. }
  121. return ADC_ERR_INIT_CONGESTION;
  122. }
  123. /**
  124. @brief 移除已初始化ADC引脚和通道
  125. @param pin -[in] 需要移除的adc引脚
  126. @param channel -[in] 需要移除的adc通道
  127. @return 错误代码
  128. */
  129. uint32_t ADC_RemovePinChannel(uint32_t pin, uint32_t channel)
  130. {
  131. for(int i=0;i<CHANNEL_MAX;i++)
  132. {
  133. if(m_adc_config[i].pin == pin && m_adc_config[i].channel == channel)
  134. {
  135. m_adc_config[i].pin = PIN_NOT_USED;
  136. m_adc_config[i].channel = CHANNEL_NOT_USED;
  137. return ADC_OP_SUCCESS;
  138. }
  139. }
  140. return ADC_ERR_REMOVE_PIN_CHANNEL;
  141. }
  142. /**
  143. @brief ADC初始化
  144. @param 无
  145. @return 无
  146. */
  147. void ADC_Initialize(void)
  148. {
  149. ADC_Init();
  150. Wakeup_Regist(cb_adcWakeup);
  151. Sleep_Regist(cb_adcSleep);
  152. }
  153. /**
  154. @brief ADC读取
  155. @param channel -[in] 需要读取的通道
  156. @param p_adc_value -[out] 返回读取的通道值
  157. @return 错误代码
  158. */
  159. uint32_t ADC_Read(uint32_t channel, int16_t *p_adc_value)
  160. {
  161. uint32_t errCode;
  162. uint32_t wait_time_out = WAIT_TIME_VALUE;
  163. uint8_t adc_sort[4] = {0xFF,0xFF,0xFF,0xFF};
  164. uint8_t sort_index = 0;
  165. int i;
  166. adc_SampleOk = false;
  167. //没有配置通道返回失败
  168. if(sample_in_buffer == 0)return ADC_ERR_READ_NO_CHANNEL;
  169. errCode = nrf_drv_saadc_sample();
  170. APP_ERROR_CHECK(errCode);
  171. //等待采集
  172. while(!adc_SampleOk)
  173. {
  174. if(wait_time_out--){
  175. nrf_pwr_mgmt_run();
  176. }
  177. else{
  178. return ADC_ERR_READ_TIMEOUT;
  179. }
  180. }
  181. //预先排序,采集时填充顺序为,通道编号小的先填充。
  182. for(i=0;i<CHANNEL_MAX;i++)
  183. {
  184. if(channelConfig[i].pin_p != NRF_SAADC_INPUT_DISABLED){
  185. adc_sort[sort_index] = i;
  186. sort_index++;
  187. }
  188. }
  189. //获取数据
  190. for(i=0;i<sample_in_buffer;i++)
  191. {
  192. if(adc_sort[i] == channel)
  193. {
  194. *p_adc_value = s_bufferPool[i];
  195. }
  196. }
  197. return ADC_OP_SUCCESS;
  198. }
  199. /**
  200. @brief 开启ADC,与初始化没有区别,为了与Disable成对出现
  201. @param 无
  202. @return 无
  203. */
  204. void ADC_Enable(void)
  205. {
  206. ADC_Init();
  207. }
  208. /**
  209. @brief 禁用ADC
  210. @param 无
  211. @return 无
  212. */
  213. void ADC_Disable(void)
  214. {
  215. nrf_drv_saadc_uninit();
  216. sample_in_buffer = 0;
  217. }