adc.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #ifndef _ADC_H__
  2. #define _ADC_H__
  3. #include "bsp/bsp.h"
  4. #include "libs/os.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_RANK_CHANNEL(c1, c2) ((c1)<<ISQ2_OFFSET | (c2)<<ISO3_OFFSET | 1<<IL_OFFSET)
  23. static u32 adc_rank_channels[6] = {
  24. ADC_RANK_CHANNEL(V_PHASE_I_CHAN, U_PHASE_I_CHAN),
  25. ADC_RANK_CHANNEL(U_PHASE_I_CHAN, V_PHASE_I_CHAN),
  26. ADC_RANK_CHANNEL(W_PHASE_I_CHAN, V_PHASE_I_CHAN),
  27. ADC_RANK_CHANNEL(V_PHASE_I_CHAN, W_PHASE_I_CHAN),
  28. ADC_RANK_CHANNEL(U_PHASE_I_CHAN, W_PHASE_I_CHAN),
  29. ADC_RANK_CHANNEL(W_PHASE_I_CHAN, U_PHASE_I_CHAN),
  30. };
  31. #define PHASE_I_ADC ADC1
  32. static u32 volatile * adc_phase_reg1[6] = {
  33. &ADC_IDATA2(PHASE_I_ADC),
  34. &ADC_IDATA3(PHASE_I_ADC),
  35. &ADC_IDATA2(PHASE_I_ADC),
  36. &ADC_IDATA3(PHASE_I_ADC),
  37. &ADC_IDATA2(PHASE_I_ADC),
  38. &ADC_IDATA3(PHASE_I_ADC),
  39. };
  40. static u32 volatile * adc_phase_reg2[6] = {
  41. &ADC_IDATA3(PHASE_I_ADC),
  42. &ADC_IDATA2(PHASE_I_ADC),
  43. &ADC_IDATA3(PHASE_I_ADC),
  44. &ADC_IDATA2(PHASE_I_ADC),
  45. &ADC_IDATA3(PHASE_I_ADC),
  46. &ADC_IDATA2(PHASE_I_ADC),
  47. };
  48. #define VBUS_I_ADC ADC0
  49. static u32 volatile * adc_vbus_reg1[6] = {
  50. &ADC_IDATA2(VBUS_I_ADC),
  51. &ADC_IDATA3(VBUS_I_ADC),
  52. &ADC_IDATA2(VBUS_I_ADC),
  53. &ADC_IDATA3(VBUS_I_ADC),
  54. &ADC_IDATA2(VBUS_I_ADC),
  55. &ADC_IDATA3(VBUS_I_ADC),
  56. };
  57. static u32 volatile * adc_vbus_reg2[6] = {
  58. &ADC_IDATA3(VBUS_I_ADC),
  59. &ADC_IDATA2(VBUS_I_ADC),
  60. &ADC_IDATA3(VBUS_I_ADC),
  61. &ADC_IDATA2(VBUS_I_ADC),
  62. &ADC_IDATA3(VBUS_I_ADC),
  63. &ADC_IDATA2(VBUS_I_ADC),
  64. };
  65. void __inline adc_phase_current_read(u8 sector, u32 *v1, u32 *v2) {
  66. *v1 = (*adc_phase_reg1[sector]) << 4;
  67. *v2 = (*adc_phase_reg2[sector]) << 4;
  68. }
  69. u32 __inline adc_phase_read_1(u8 sector) {
  70. return (*adc_phase_reg1[sector]) << 4;
  71. }
  72. void __inline adc_vbus_current_read(u8 sector, u32 *v1, u32 *v2) {
  73. *v1 = (*adc_vbus_reg1[sector]) << 4;
  74. *v2 = (*adc_vbus_reg2[sector]) << 4;
  75. }
  76. u32 __inline adc_vbus_read_1(u8 sector) {
  77. return (*adc_vbus_reg1[sector]) << 4;
  78. }
  79. void __inline adc_phase_inserted_config(u8 sector) {
  80. ADC_ISQ(ADC1) = adc_rank_channels[sector];
  81. }
  82. #define ADC_TRIGGER_PHASE ADC0_1_EXTTRIG_INSERTED_T0_CH3
  83. #define ADC_TRIGGER_VBUS ADC0_1_EXTTRIG_INSERTED_T1_CH0
  84. void __inline adc_config_trigger(u32 trigger) {
  85. ADC_CTL1(ADC0) &= ~((uint32_t)ADC_CTL1_ETSIC);
  86. ADC_CTL1(ADC0) |= (uint32_t)trigger;
  87. ADC_CTL1(ADC1) &= ~((uint32_t)ADC_CTL1_ETSIC);
  88. ADC_CTL1(ADC1) |= (uint32_t)trigger;
  89. }
  90. bool __inline adc_is_trigged_vbus(void) {
  91. if (ADC_CTL1(ADC0) & ADC_TRIGGER_VBUS == ADC_TRIGGER_VBUS) {
  92. return true;
  93. }
  94. return false;
  95. }
  96. /* insert len fixed to 2(IL=1), ISQ2 >> ISQ3*/
  97. static __inline__ void adc1_update_insert_sample_rank(u8 channel1, u8 channel2) {
  98. u32 isq;
  99. isq = ADC_ISQ(ADC1);
  100. isq &= 0xFFF0000;
  101. isq |= (channel1 << 10) | (channel2 << 15);
  102. ADC_ISQ(ADC1) = isq;
  103. }
  104. static __inline__ void adc1_update_insert_sample_time(uint8_t adc_channel , uint32_t sample_time)
  105. {
  106. uint32_t sampt;
  107. /* ADC sampling time config */
  108. if(adc_channel < 10U){
  109. sampt = ADC_SAMPT1(ADC1);
  110. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*adc_channel)));
  111. sampt |= (u32) sample_time << (3U*adc_channel);
  112. ADC_SAMPT1(ADC1) = sampt;
  113. }else if(adc_channel < 18U){
  114. sampt = ADC_SAMPT0(ADC1);
  115. sampt &= ~((u32)(ADC_SAMPTX_SPTN << (3U*(adc_channel-10U))));
  116. sampt |= ((u32)sample_time << (3U*(adc_channel-10U)));
  117. ADC_SAMPT0(ADC1) = sampt;
  118. }
  119. }
  120. void adc_init(void);
  121. s32 adc_sample_regular_channel(int chan, int times);
  122. void adc_start_insert_convert(void);
  123. #endif /* _ADC_H__ */