adc.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #ifndef _ADC_H__
  2. #define _ADC_H__
  3. #include "bsp/bsp.h"
  4. #include "os/os_types.h"
  5. /*
  6. inserted ADC 由timer0 ch3触发,
  7. 注意:adc所有外部触发都是下降沿触发
  8. */
  9. #ifdef GD32_FOC_DEMO
  10. #define U_PHASE_I_CHAN ADC_CHANNEL_1
  11. #define V_PHASE_I_CHAN ADC_CHANNEL_12
  12. #define W_PHASE_I_CHAN ADC_CHANNEL_13
  13. #define MOTOR_TEMP_CHAN ADC_CHANNEL_11
  14. #define VBUS_V_CHAN ADC_CHANNEL_0
  15. #define THROTTLE_CHAN ADC_CHANNEL_2
  16. #else
  17. #define MOTOR_TEMP_CHAN ADC_CHANNEL_0
  18. #define THROTTLE_CHAN ADC_CHANNEL_1 //转把信号
  19. #define VBUS_V_CHAN ADC_CHANNEL_2
  20. #define W_PHASE_V_CHAN ADC_CHANNEL_3
  21. #define V_PHASE_V_CHAN ADC_CHANNEL_4
  22. #define U_PHASE_V_CHAN ADC_CHANNEL_5
  23. #define W_PHASE_I_CHAN ADC_CHANNEL_6
  24. #define V_PHASE_I_CHAN ADC_CHANNEL_7
  25. #define U_PHASE_I_CHAN ADC_CHANNEL_8
  26. #define VBUS_I_CHAN ADC_CHANNEL_9
  27. #endif
  28. #define ISQ2_OFFSET 10
  29. #define ISO3_OFFSET 15
  30. #define IL_OFFSET 20
  31. #define ADC_SAMPLE_TIME ADC_SAMPLETIME_7POINT5
  32. #define ADC_TRIGGER_PHASE ADC0_1_EXTTRIG_INSERTED_T0_CH3
  33. #define ADC_TRIGGER_PHASE2 ADC0_1_EXTTRIG_INSERTED_T1_CH0
  34. #define ADC_TRIGGER_NONE ADC0_1_2_EXTTRIG_INSERTED_NONE
  35. #define ADC_TRIGGER_VBUS ADC0_1_EXTTRIG_INSERTED_T1_CH0
  36. #define PHASE_AB 0
  37. #define PHASE_AC 1
  38. #define PHASE_BC 2
  39. //#define ADC_RANK_CHANNEL(c1, c2, l) ((c1)<<ISQ2_OFFSET | (c2)<<ISO3_OFFSET | (l)<<IL_OFFSET)
  40. #define ADC_RANK_CHANNEL(c) ((c)<<ISO3_OFFSET | (0)<<IL_OFFSET)
  41. #define ADC_CALI_RANK_CHANEL(c) ((c)<<ISO3_OFFSET | (0)<<IL_OFFSET)
  42. #if 0
  43. static u32 adc0_rank_channels[6] = {
  44. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//1, B, BC
  45. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//2, A, AC
  46. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//3, C, CA
  47. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//4, B, BA
  48. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//5, A, AB
  49. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//6, C, CB
  50. };
  51. static u32 adc1_rank_channels[6] = {
  52. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//1, C
  53. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//2, C
  54. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//3, A
  55. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//4, A
  56. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//5, B
  57. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//5, B
  58. };
  59. static u32 volatile * adc_phase_reg1[6] = {
  60. &ADC_IDATA0(ADC0),//1, B
  61. &ADC_IDATA0(ADC0),//2, A
  62. &ADC_IDATA0(ADC1),//3, A
  63. &ADC_IDATA0(ADC0),//4, B
  64. &ADC_IDATA0(ADC1),//5, B
  65. &ADC_IDATA0(ADC1),//6, B
  66. };
  67. static u32 volatile * adc_phase_reg2[6] = {
  68. &ADC_IDATA0(ADC1),//1, C
  69. &ADC_IDATA0(ADC1),//2, C
  70. &ADC_IDATA0(ADC0),//3, C
  71. &ADC_IDATA0(ADC1),//4, A
  72. &ADC_IDATA0(ADC0),//5, A
  73. &ADC_IDATA0(ADC0),//6, C
  74. };
  75. static void __inline adc_phase_current_read(u8 sector, s32 *v1, s32 *v2) {
  76. #if SHUNT_NUM==THREE_SHUNTS_SAMPLE
  77. *v1 = (s32)(*adc_phase_reg1[sector]) ;
  78. *v2 = (s32)(*adc_phase_reg2[sector]) ;
  79. #else
  80. *v1 = (ADC_IDATA0(ADC0) & 0xFFF);
  81. *v2 = (ADC_IDATA0(ADC1) & 0xFFF);
  82. #endif
  83. }
  84. static void __inline adc_current_sample_config(u8 sector) {
  85. #if SHUNT_NUM==THREE_SHUNTS_SAMPLE
  86. ADC_ISQ(ADC0) = adc0_rank_channels[sector];
  87. ADC_ISQ(ADC1) = adc1_rank_channels[sector];
  88. #endif
  89. }
  90. #else
  91. static u32 adc0_rank_channels[3] = {
  92. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//0, A, AB
  93. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//1, A, AC
  94. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//2, B, BC
  95. };
  96. static u32 adc1_rank_channels[3] = {
  97. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//0, B
  98. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//1, C
  99. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//2, C
  100. };
  101. static u32 volatile * adc_phase_reg1[3] = {
  102. &ADC_IDATA0(ADC0),//0, A
  103. &ADC_IDATA0(ADC0),//1, A
  104. &ADC_IDATA0(ADC0),//2, B
  105. };
  106. static u32 volatile * adc_phase_reg2[3] = {
  107. &ADC_IDATA0(ADC1),//0, B
  108. &ADC_IDATA0(ADC1),//1, C
  109. &ADC_IDATA0(ADC1),//2, C
  110. };
  111. static void __inline adc_phase_current_read(u8 phases, s32 *v1, s32 *v2) {
  112. #if SHUNT_NUM==THREE_SHUNTS_SAMPLE
  113. *v1 = (s32)(*adc_phase_reg1[phases]) ;
  114. *v2 = (s32)(*adc_phase_reg2[phases]) ;
  115. #else
  116. *v1 = (ADC_IDATA0(ADC0) & 0xFFF);
  117. *v2 = (ADC_IDATA0(ADC1) & 0xFFF);
  118. #endif
  119. }
  120. static void __inline adc_current_sample_config(u8 phases) {
  121. #if SHUNT_NUM==THREE_SHUNTS_SAMPLE
  122. ADC_ISQ(ADC0) = adc0_rank_channels[phases];
  123. ADC_ISQ(ADC1) = adc1_rank_channels[phases];
  124. #endif
  125. }
  126. #endif
  127. static void __inline adc_disable_ext_trigger(void) {
  128. ADC_CTL1(ADC0) &= ~ADC_CTL1_ETEIC;
  129. #if SHUNT_NUM==ONE_SHUNT_SAMPLE
  130. ADC_CTL1(ADC1) &= ~ADC_CTL1_ETEIC;
  131. #endif
  132. }
  133. static void __inline adc_enable_ext_trigger(void) {
  134. ADC_CTL1(ADC0) |= ADC_CTL1_ETEIC;
  135. #if SHUNT_NUM==ONE_SHUNT_SAMPLE
  136. ADC_CTL1(ADC1) |= ADC_CTL1_ETEIC;
  137. #endif
  138. }
  139. /* insert len fixed to 2(IL=1), ISQ2 >> ISQ3*/
  140. static __inline__ void adc_update_insert_sample_rank(u32 adc, u8 channel) {
  141. ADC_ISQ(adc) = ADC_RANK_CHANNEL(channel);
  142. }
  143. static __inline__ void adc_update_insert_sample_time(u32 adc, uint8_t adc_channel , uint32_t sample_time)
  144. {
  145. uint32_t sampt;
  146. /* ADC sampling time config */
  147. if(adc_channel < 10U){
  148. sampt = ADC_SAMPT1(adc);
  149. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*adc_channel)));
  150. sampt |= (u32) sample_time << (3U*adc_channel);
  151. ADC_SAMPT1(adc) = sampt;
  152. }else if(adc_channel < 18U){
  153. sampt = ADC_SAMPT0(adc);
  154. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*(adc_channel-10U))));
  155. sampt |= ((u32)sample_time << (3U*(adc_channel-10U)));
  156. ADC_SAMPT0(adc) = sampt;
  157. }
  158. }
  159. static __inline__ bool adc_eoic_interrupt(void)
  160. {
  161. #if SHUNT_NUM==THREE_SHUNTS_SAMPLE
  162. if (ADC_STAT(ADC0) & ADC_STAT_EOIC){
  163. return true;
  164. }
  165. #endif
  166. #if SHUNT_NUM==ONE_SHUNT_SAMPLE
  167. if (ADC_STAT(ADC1) & ADC_STAT_EOIC){
  168. return true;
  169. }
  170. #endif
  171. return false;
  172. }
  173. static __inline__ void adc_clear_irq_flags(void) {
  174. #if SHUNT_NUM==THREE_SHUNTS_SAMPLE
  175. ADC_STAT(ADC0) &= ~((u32) ADC_INT_FLAG_EOIC);
  176. ADC_STAT(ADC1) &= ~((u32) ADC_INT_FLAG_EOIC);
  177. #else
  178. ADC_STAT(ADC0) &= ~((u32) ADC_INT_FLAG_EOIC);
  179. ADC_STAT(ADC1) &= ~((u32) ADC_INT_FLAG_EOIC);
  180. #endif
  181. }
  182. static __inline void adc_update_ext_trigger(u32 trigger) {
  183. adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, trigger);
  184. }
  185. void adc_init(void);
  186. s32 adc_sample_regular_channel(int chan, int times);
  187. void adc_start_convert(void);
  188. void adc_stop_convert(void);
  189. #endif /* _ADC_H__ */