adc.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #ifndef _ADC_H__
  2. #define _ADC_H__
  3. #include "bsp/bsp.h"
  4. #include "os/os_types.h"
  5. float adc_vref_compesion(void);
  6. float adc_5vref_compesion(void);
  7. /*
  8. inserted ADC 由timer0 ch3触发,
  9. 注意:adc所有外部触发都是下降沿触发
  10. */
  11. #define ISQ0_OFFSET 0
  12. #define ISQ1_OFFSET 5
  13. #define ISQ2_OFFSET 10
  14. #define ISQ3_OFFSET 15
  15. #define IL_OFFSET 20
  16. #define ADC_INSERT_SAMPLE_TIME ADC_SAMPLETIME_13POINT5
  17. #ifdef CONFIG_SENSORLESS_TOW_SAMPLES
  18. #define ADC_TRIGGER_PHASE ADC0_1_EXTTRIG_INSERTED_T0_TRGO
  19. #else
  20. #define ADC_TRIGGER_PHASE ADC0_1_EXTTRIG_INSERTED_T0_CH3
  21. #endif
  22. #define ADC_TRIGGER_PHASE2 ADC0_1_EXTTRIG_INSERTED_T1_CH0
  23. #define ADC_TRIGGER_NONE ADC0_1_2_EXTTRIG_INSERTED_NONE
  24. #define ADC_TRIGGER_VBUS ADC0_1_EXTTRIG_INSERTED_T1_CH0
  25. #define PHASE_AB 0
  26. #define PHASE_AC 1
  27. #define PHASE_BC 2
  28. #define ADC_RANK_CHANNEL(c) ((c)<<ISQ3_OFFSET | (0)<<IL_OFFSET)
  29. #define ADC_INS_RANK_4_CHANS(c1,c2,c3,c4) (((c1)<<ISQ0_OFFSET) | ((c2)<<ISQ1_OFFSET) | ((c3)<<ISQ2_OFFSET) | ((c4)<<ISQ3_OFFSET) | ((3)<<IL_OFFSET))
  30. #define INJ_CHAN_NUM 1
  31. #ifndef HIGH_SIDE_CURRENT_SENSOR
  32. static u32 adc0_rank_channels[3] = {
  33. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//0, A, AB
  34. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//1, A, AC
  35. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//2, B, BC
  36. };
  37. static u32 adc1_rank_channels[3] = {
  38. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//0, B
  39. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//1, C
  40. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//2, C
  41. };
  42. static u32 volatile * adc_phase_reg1[3] = {
  43. &ADC_IDATA0(ADC0),//0, A
  44. &ADC_IDATA0(ADC0),//1, A
  45. &ADC_IDATA0(ADC0),//2, B
  46. };
  47. static u32 volatile * adc_phase_reg2[3] = {
  48. &ADC_IDATA0(ADC1),//0, B
  49. &ADC_IDATA0(ADC1),//1, C
  50. &ADC_IDATA0(ADC1),//2, C
  51. };
  52. #endif
  53. #define v_calc(sum, v, min, max) \
  54. do { \
  55. if (v > max) { \
  56. max = v; \
  57. } \
  58. if (v < min) { \
  59. min = v; \
  60. }\
  61. sum += v; \
  62. }while(0);
  63. static void __inline adc_phase_current_read(u8 phases, s32 *pv1, s32 *pv2) {
  64. #ifdef HIGH_SIDE_CURRENT_SENSOR
  65. #if (INJ_CHAN_NUM==4)
  66. u16 min, max;
  67. u16 sum = 0;
  68. u16 v1 = ADC_IDATA0(ADC0);
  69. u16 v2 = ADC_IDATA1(ADC1);
  70. u16 v3 = ADC_IDATA2(ADC0);
  71. u16 v4 = ADC_IDATA3(ADC1);
  72. min = max = v1;
  73. sum += v1;
  74. v_calc(sum, v2, min, max);
  75. v_calc(sum, v3, min, max);
  76. v_calc(sum, v4, min, max);
  77. *pv1 = (s32) ((sum-min-max)/2.0f * adc_5vref_compesion());
  78. sum = 0;
  79. v1 = ADC_IDATA0(ADC1);
  80. v2 = ADC_IDATA1(ADC0);
  81. v3 = ADC_IDATA2(ADC1);
  82. v4 = ADC_IDATA3(ADC0);
  83. min = max = v1;
  84. sum += v1;
  85. v_calc(sum, v2, min, max);
  86. v_calc(sum, v3, min, max);
  87. v_calc(sum, v4, min, max);
  88. *pv2 = (s32) ((sum-min-max)/2.0f * adc_5vref_compesion());
  89. #else
  90. *pv1 = (s32)((float)ADC_IDATA0(ADC0) * adc_5vref_compesion());
  91. *pv2 = (s32)((float)ADC_IDATA0(ADC1) * adc_5vref_compesion());
  92. #endif
  93. #else
  94. *pv1 = (s32)(*adc_phase_reg1[phases]) ;
  95. *pv2 = (s32)(*adc_phase_reg2[phases]) ;
  96. #endif
  97. }
  98. static void __inline adc_current_sample_config(u8 phases) {
  99. #ifdef HIGH_SIDE_CURRENT_SENSOR
  100. #if (INJ_CHAN_NUM==4)
  101. //ADC_ISQ(ADC0) = ADC_INS_RANK_4_CHANS(V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN);
  102. //ADC_ISQ(ADC1) = ADC_INS_RANK_4_CHANS(W_PHASE_I_CHAN, V_PHASE_I_CHAN, W_PHASE_I_CHAN, V_PHASE_I_CHAN);
  103. #else
  104. ADC_ISQ(ADC0) = ADC_RANK_CHANNEL(V_PHASE_I_CHAN);
  105. ADC_ISQ(ADC1) = ADC_RANK_CHANNEL(W_PHASE_I_CHAN);
  106. #endif
  107. #else
  108. ADC_ISQ(ADC0) = adc0_rank_channels[phases];
  109. ADC_ISQ(ADC1) = adc1_rank_channels[phases];
  110. #endif
  111. }
  112. static void __inline adc_disable_ext_trigger(void) {
  113. ADC_CTL1(ADC0) &= ~ADC_CTL1_ETEIC;
  114. }
  115. static void __inline adc_enable_ext_trigger(void) {
  116. ADC_CTL1(ADC0) |= ADC_CTL1_ETEIC;
  117. }
  118. /* insert len fixed to 2(IL=1), ISQ2 >> ISQ3*/
  119. static __inline__ void adc_update_insert_sample_rank(u32 adc, u8 channel) {
  120. ADC_ISQ(adc) = ADC_RANK_CHANNEL(channel);
  121. }
  122. static __inline__ void adc_update_insert_sample_time(u32 adc, uint8_t adc_channel , uint32_t sample_time)
  123. {
  124. uint32_t sampt;
  125. /* ADC sampling time config */
  126. if(adc_channel < 10U){
  127. sampt = ADC_SAMPT1(adc);
  128. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*adc_channel)));
  129. sampt |= (u32) sample_time << (3U*adc_channel);
  130. ADC_SAMPT1(adc) = sampt;
  131. }else if(adc_channel < 18U){
  132. sampt = ADC_SAMPT0(adc);
  133. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*(adc_channel-10U))));
  134. sampt |= ((u32)sample_time << (3U*(adc_channel-10U)));
  135. ADC_SAMPT0(adc) = sampt;
  136. }
  137. }
  138. static __inline__ bool adc_eoic_interrupt(void)
  139. {
  140. if (ADC_STAT(ADC0) & ADC_STAT_EOIC){
  141. return true;
  142. }
  143. return false;
  144. }
  145. static __inline__ void adc_clear_irq_flags(void) {
  146. ADC_STAT(ADC0) &= ~((u32) ADC_INT_FLAG_EOIC);
  147. ADC_STAT(ADC1) &= ~((u32) ADC_INT_FLAG_EOIC);
  148. }
  149. static __inline void adc_update_ext_trigger(u32 trigger) {
  150. adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, trigger);
  151. }
  152. void adc_init(void);
  153. s32 adc_sample_regular_channel(int chan, int times);
  154. void adc_start_convert(void);
  155. void adc_stop_convert(void);
  156. u16 adc_get_vbus(void);
  157. u16 adc_get_acc(void);
  158. u16 adc_get_throttle(void);
  159. void adc_get_uvw_phaseV(u16 *uvw);
  160. u16 adc_get_mos_temp(void);
  161. u16 adc_get_motor_temp(void);
  162. u16 adc_get_ibus(void);
  163. u16 adc_get_vref(void);
  164. void adc_set_vref_calc(float v);
  165. void adc_vref_filter(void);
  166. u16 adc_get_5v_ref(void);
  167. void adc_set_5vref_calc(float v);
  168. u16 adc_get_throttle2(void);
  169. u16 adc_get_thro_5v(void);
  170. u16 adc_get_thro2_5v(void);
  171. #endif /* _ADC_H__ */