adc.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. #define ISQ0_OFFSET 0
  10. #define ISQ1_OFFSET 5
  11. #define ISQ2_OFFSET 10
  12. #define ISQ3_OFFSET 15
  13. #define IL_OFFSET 20
  14. #define ADC_SAMPLE_TIME ADC_SAMPLETIME_7POINT5
  15. #define ADC_TRIGGER_PHASE ADC0_1_EXTTRIG_INSERTED_T0_CH3
  16. #define ADC_TRIGGER_PHASE2 ADC0_1_EXTTRIG_INSERTED_T1_CH0
  17. #define ADC_TRIGGER_NONE ADC0_1_2_EXTTRIG_INSERTED_NONE
  18. #define ADC_TRIGGER_VBUS ADC0_1_EXTTRIG_INSERTED_T1_CH0
  19. #define PHASE_AB 0
  20. #define PHASE_AC 1
  21. #define PHASE_BC 2
  22. #define ADC_RANK_CHANNEL(c) ((c)<<ISQ3_OFFSET | (0)<<IL_OFFSET)
  23. #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))
  24. #ifndef HIGH_SIDE_CURRENT_SENSOR
  25. static u32 adc0_rank_channels[3] = {
  26. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//0, A, AB
  27. ADC_RANK_CHANNEL(U_PHASE_I_CHAN),//1, A, AC
  28. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//2, B, BC
  29. };
  30. static u32 adc1_rank_channels[3] = {
  31. ADC_RANK_CHANNEL(V_PHASE_I_CHAN),//0, B
  32. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//1, C
  33. ADC_RANK_CHANNEL(W_PHASE_I_CHAN),//2, C
  34. };
  35. static u32 volatile * adc_phase_reg1[3] = {
  36. &ADC_IDATA0(ADC0),//0, A
  37. &ADC_IDATA0(ADC0),//1, A
  38. &ADC_IDATA0(ADC0),//2, B
  39. };
  40. static u32 volatile * adc_phase_reg2[3] = {
  41. &ADC_IDATA0(ADC1),//0, B
  42. &ADC_IDATA0(ADC1),//1, C
  43. &ADC_IDATA0(ADC1),//2, C
  44. };
  45. #endif
  46. #ifdef CONFIG_SW_MUTISAMPLE
  47. static s32 __inline _adc_avg(s32 *v) {
  48. s32 max_v = 0;
  49. s32 min_v = 4096*32;
  50. s32 total_v = 0;
  51. for (int i = 0; i < 4; i++) {
  52. if (v[i] > max_v) {
  53. max_v = v[i];
  54. }else if (v[i] < min_v) {
  55. min_v = v[i];
  56. }
  57. total_v += v[i];
  58. }
  59. total_v -= (max_v + min_v);
  60. return (total_v>>1);
  61. }
  62. #endif
  63. static void __inline adc_phase_current_read(u8 phases, s32 *v1, s32 *v2) {
  64. #ifdef CONFIG_HW_MUTISAMPLE
  65. *v1 = ADC_IDATA0(ADC0);
  66. *v2 = ADC_IDATA0(ADC1);
  67. #elif defined (CONFIG_SW_MUTISAMPLE)
  68. s32 v[4];
  69. v[0] = ADC_IDATA0(ADC0);
  70. v[1] = ADC_IDATA1(ADC0);
  71. v[2] = ADC_IDATA2(ADC0);
  72. v[3] = ADC_IDATA3(ADC0);
  73. *v1 = _adc_avg(v);
  74. v[0] = ADC_IDATA0(ADC1);
  75. v[1] = ADC_IDATA1(ADC1);
  76. v[2] = ADC_IDATA2(ADC1);
  77. v[3] = ADC_IDATA3(ADC1);
  78. *v2 = _adc_avg(v);
  79. #else
  80. *v1 = (s32)(*adc_phase_reg1[phases]) ;
  81. *v2 = (s32)(*adc_phase_reg2[phases]) ;
  82. #endif
  83. }
  84. static void __inline adc_current_sample_config(u8 phases) {
  85. #ifdef CONFIG_HW_MUTISAMPLE
  86. ADC_ISQ(ADC0) = ADC_RANK_CHANNEL(V_PHASE_I_CHAN);
  87. ADC_ISQ(ADC1) = ADC_RANK_CHANNEL(W_PHASE_I_CHAN);
  88. #elif defined (CONFIG_SW_MUTISAMPLE)
  89. ADC_ISQ(ADC0) = ADC_INS_RANK_4_CHANS(V_PHASE_I_CHAN, V_PHASE_I_CHAN, V_PHASE_I_CHAN, V_PHASE_I_CHAN);
  90. ADC_ISQ(ADC1) = ADC_INS_RANK_4_CHANS(W_PHASE_I_CHAN, W_PHASE_I_CHAN, W_PHASE_I_CHAN, W_PHASE_I_CHAN);
  91. #else
  92. ADC_ISQ(ADC0) = adc0_rank_channels[phases];
  93. ADC_ISQ(ADC1) = adc1_rank_channels[phases];
  94. #endif
  95. }
  96. static void __inline adc_disable_ext_trigger(void) {
  97. ADC_CTL1(ADC0) &= ~ADC_CTL1_ETEIC;
  98. }
  99. static void __inline adc_enable_ext_trigger(void) {
  100. ADC_CTL1(ADC0) |= ADC_CTL1_ETEIC;
  101. }
  102. /* insert len fixed to 2(IL=1), ISQ2 >> ISQ3*/
  103. static __inline__ void adc_update_insert_sample_rank(u32 adc, u8 channel) {
  104. ADC_ISQ(adc) = ADC_RANK_CHANNEL(channel);
  105. }
  106. static __inline__ void adc_update_insert_sample_time(u32 adc, uint8_t adc_channel , uint32_t sample_time)
  107. {
  108. uint32_t sampt;
  109. /* ADC sampling time config */
  110. if(adc_channel < 10U){
  111. sampt = ADC_SAMPT1(adc);
  112. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*adc_channel)));
  113. sampt |= (u32) sample_time << (3U*adc_channel);
  114. ADC_SAMPT1(adc) = sampt;
  115. }else if(adc_channel < 18U){
  116. sampt = ADC_SAMPT0(adc);
  117. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*(adc_channel-10U))));
  118. sampt |= ((u32)sample_time << (3U*(adc_channel-10U)));
  119. ADC_SAMPT0(adc) = sampt;
  120. }
  121. }
  122. static __inline__ bool adc_eoic_interrupt(void)
  123. {
  124. if (ADC_STAT(ADC0) & ADC_STAT_EOIC){
  125. return true;
  126. }
  127. return false;
  128. }
  129. static __inline__ void adc_clear_irq_flags(void) {
  130. ADC_STAT(ADC0) &= ~((u32) ADC_INT_FLAG_EOIC);
  131. ADC_STAT(ADC1) &= ~((u32) ADC_INT_FLAG_EOIC);
  132. }
  133. static __inline void adc_update_ext_trigger(u32 trigger) {
  134. adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, trigger);
  135. }
  136. void adc_init(void);
  137. s32 adc_sample_regular_channel(int chan, int times);
  138. void adc_start_convert(void);
  139. void adc_stop_convert(void);
  140. u16 adc_get_vbus(void);
  141. u16 adc_get_acc(void);
  142. u16 adc_get_throttle(void);
  143. void adc_get_uvw_phaseV(u16 *uvw);
  144. u16 adc_get_mos_temp(void);
  145. u16 adc_get_mos_temp2(void);
  146. u16 adc_get_motor_temp(void);
  147. u16 adc_get_ibus(void);
  148. #endif /* _ADC_H__ */