adc.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #ifndef _ADC_H__
  2. #define _ADC_H__
  3. #include "bsp/bsp.h"
  4. #include "os/os_type.h"
  5. /*
  6. inserted ADC 由timer0 ch3触发,
  7. 注意:adc所有外部触发都是下降沿触发
  8. */
  9. #define MOTOR_TEMP_CHAN ADC_CHANNEL_0
  10. #define HANDLERBAR_CHAN ADC_CHANNEL_1 //转把信号
  11. #define VBUS_V_CHAN ADC_CHANNEL_2
  12. #define W_PHASE_V_CHAN ADC_CHANNEL_3
  13. #define V_PHASE_V_CHAN ADC_CHANNEL_4
  14. #define U_PHASE_V_CHAN ADC_CHANNEL_5
  15. #define W_PHASE_I_CHAN ADC_CHANNEL_6
  16. #define V_PHASE_I_CHAN ADC_CHANNEL_7
  17. #define U_PHASE_I_CHAN ADC_CHANNEL_8
  18. #define VBUS_I_CHAN ADC_CHANNEL_9
  19. #define ISQ2_OFFSET 10
  20. #define ISO3_OFFSET 15
  21. #define IL_OFFSET 20
  22. #define ADC_SAMPLE_TIME ADC_SAMPLETIME_7POINT5
  23. //#define ADC_RANK_CHANNEL(c1, c2, l) ((c1)<<ISQ2_OFFSET | (c2)<<ISO3_OFFSET | (l)<<IL_OFFSET)
  24. #define ADC_RANK_CHANNEL(c) ((c)<<ISO3_OFFSET | (0)<<IL_OFFSET)
  25. #define ADC_CALI_RANK_CHANEL(c) ((c)<<ISO3_OFFSET | (0)<<IL_OFFSET)
  26. static u32 adc0_rank_channels[6] = {
  27. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//1, UW, AC
  28. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//2, VW, BC
  29. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//3, VU, BA
  30. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//4, WU, CA
  31. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//5, WV, CB
  32. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//6, UV, AB
  33. };
  34. static u32 adc1_rank_channels[6] = {
  35. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),
  36. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),
  37. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),
  38. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),
  39. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),
  40. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),
  41. };
  42. static u32 adc0_cali_rank_channels[3] = {
  43. ADC_CALI_RANK_CHANEL(U_PHASE_I_CHAN),
  44. ADC_CALI_RANK_CHANEL(V_PHASE_I_CHAN),
  45. ADC_CALI_RANK_CHANEL(W_PHASE_I_CHAN),
  46. };
  47. static u32 adc1_cali_rank_channels[3] = {
  48. ADC_CALI_RANK_CHANEL(VBUS_I_CHAN),
  49. ADC_CALI_RANK_CHANEL(VBUS_I_CHAN),
  50. ADC_CALI_RANK_CHANEL(VBUS_I_CHAN),
  51. };
  52. #define PHASE_I_ADC ADC0
  53. static u32 volatile * adc_phase_reg1[6] = {
  54. &ADC_IDATA0(ADC0),//1, U
  55. &ADC_IDATA0(ADC0),//2, V
  56. &ADC_IDATA0(ADC0),//3, V
  57. &ADC_IDATA0(ADC1),//4, U
  58. &ADC_IDATA0(ADC1),//5, V
  59. &ADC_IDATA0(ADC1),//6, V
  60. };
  61. static u32 volatile * adc_phase_reg2[6] = {
  62. &ADC_IDATA0(ADC1),//1, W
  63. &ADC_IDATA0(ADC1),//2, W
  64. &ADC_IDATA0(ADC1),//3, U
  65. &ADC_IDATA0(ADC0),//4, W
  66. &ADC_IDATA0(ADC0),//5, W
  67. &ADC_IDATA0(ADC0),//6, U
  68. };
  69. static void __inline adc_phase_current_read(u8 sector, s32 *v1, s32 *v2) {
  70. *v1 = (s32)(*adc_phase_reg1[sector]) ;
  71. *v2 = (s32)(*adc_phase_reg2[sector]) ;
  72. }
  73. static void __inline adc_cali_current_read(s32 *v1, s32 *v2) {
  74. *v1 = (s32)ADC_IDATA0(ADC0);
  75. *v2 = (s32)ADC_IDATA0(ADC1);
  76. }
  77. static void __inline adc_phase_inserted_config(u8 sector) {
  78. ADC_CTL0(ADC0) &= ~(ADC_CTL0_SYNCM);
  79. ADC_ISQ(ADC0) = adc0_rank_channels[sector];
  80. ADC_ISQ(ADC1) = adc1_rank_channels[sector];
  81. ADC_CTL0(ADC0) |= ADC_DAUL_INSERTED_PARALLEL;
  82. }
  83. static void __inline adc_cali_inserted_config(u8 invert) {
  84. ADC_ISQ(ADC0) = adc0_cali_rank_channels[invert];
  85. ADC_ISQ(ADC1) = adc1_cali_rank_channels[invert];
  86. }
  87. #define ADC_TRIGGER_PHASE ADC0_1_EXTTRIG_INSERTED_T0_CH3
  88. #define ADC_TRIGGER_VBUS ADC0_1_EXTTRIG_INSERTED_T1_CH0
  89. static void __inline adc_config_trigger(u32 trigger) {
  90. ADC_CTL1(ADC0) &= ~((uint32_t)ADC_CTL1_ETSIC);
  91. ADC_CTL1(ADC0) |= (uint32_t)trigger;
  92. ADC_CTL1(ADC1) &= ~((uint32_t)ADC_CTL1_ETSIC);
  93. ADC_CTL1(ADC1) |= (uint32_t)trigger;
  94. }
  95. static void __inline adc_disable_ext_trigger(void) {
  96. ADC_CTL0(ADC0) &= ~(ADC_CTL0_SYNCM);
  97. ADC_CTL1(ADC0) &= ~ADC_CTL1_ETEIC;
  98. ADC_CTL1(ADC1) &= ~ADC_CTL1_ETEIC;
  99. ADC_CTL0(ADC0) |= ADC_DAUL_INSERTED_PARALLEL;
  100. }
  101. static void __inline adc_enable_ext_trigger(void) {
  102. ADC_CTL0(ADC0) &= ~(ADC_CTL0_SYNCM);
  103. ADC_CTL1(ADC0) |= ADC_CTL1_ETEIC;
  104. ADC_CTL1(ADC1) |= ADC_CTL1_ETEIC;
  105. ADC_CTL0(ADC0) |= ADC_DAUL_INSERTED_PARALLEL;
  106. }
  107. static bool __inline adc_is_trigged_vbus(void) {
  108. if ((ADC_CTL1(ADC1) & ADC_TRIGGER_VBUS) == ADC_TRIGGER_VBUS) {
  109. return true;
  110. }
  111. return false;
  112. }
  113. /* insert len fixed to 2(IL=1), ISQ2 >> ISQ3*/
  114. static __inline__ void adc_update_insert_sample_rank(u32 adc, u8 channel) {
  115. ADC_ISQ(adc) = ADC_RANK_CHANNEL(channel);
  116. }
  117. static __inline__ void adc_update_insert_sample_time(u32 adc, uint8_t adc_channel , uint32_t sample_time)
  118. {
  119. uint32_t sampt;
  120. /* ADC sampling time config */
  121. if(adc_channel < 10U){
  122. sampt = ADC_SAMPT1(adc);
  123. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*adc_channel)));
  124. sampt |= (u32) sample_time << (3U*adc_channel);
  125. ADC_SAMPT1(adc) = sampt;
  126. }else if(adc_channel < 18U){
  127. sampt = ADC_SAMPT0(adc);
  128. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*(adc_channel-10U))));
  129. sampt |= ((u32)sample_time << (3U*(adc_channel-10U)));
  130. ADC_SAMPT0(adc) = sampt;
  131. }
  132. }
  133. static __inline__ bool adc_eoic_interrupt(void)
  134. {
  135. #if 0
  136. if (ADC_STAT(ADC0) & ADC_STAT_EOIC){
  137. return true;
  138. }
  139. if (ADC_STAT(ADC1) & ADC_STAT_EOIC){
  140. return true;
  141. }
  142. #else
  143. if ((ADC_STAT(ADC0) & ADC_STAT_EOIC) && (ADC_STAT(ADC1) & ADC_STAT_EOIC)){
  144. return true;
  145. }
  146. #endif
  147. return false;
  148. }
  149. static __inline__ void adc_clear_eoic_flags(void) {
  150. ADC_STAT(ADC0) &= ~((u32) ADC_STAT_EOIC);
  151. ADC_STAT(ADC1) &= ~((u32) ADC_STAT_EOIC);
  152. }
  153. static __inline__ void adc_insert_continue_mode(u32 adc_periph) {
  154. ADC_CTL0(adc_periph) &= ~((uint32_t)(ADC_CTL0_DISIC ));
  155. }
  156. void adc_init(void);
  157. s32 adc_sample_regular_channel(int chan, int times);
  158. void adc_start_insert_convert(void);
  159. void adc_stop_insert_convert(void);
  160. #endif /* _ADC_H__ */