adc.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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_INJ_SAMPLE_TIME ADC_SAMP_TIME_7CYCLES5
  17. #define ADC_REGCHAN_SAMPLE_TIME ADC_SAMP_TIME_239CYCLES5
  18. #define ADC_TRIGGER_PHASE ADC_EXT_TRIG_INJ_CONV_T1_CC4
  19. #define PHASE_AB 0
  20. #define PHASE_AC 1
  21. #define PHASE_BC 2
  22. #define JDAT_OFFSET ((uint8_t)0x28)
  23. #define CTRL2_INJ_EXT_TRIG_SET ((uint32_t)0x00008000)
  24. #define CTRL2_INJ_EXT_TRIG_RESET ((uint32_t)0xFFFF7FFF)
  25. #define INJ_CHAN_NUM 4
  26. static u16 __inline ADC_GetInjectedDat(ADC_Module* ADCx, uint8_t ADC_InjectedChannel)
  27. {
  28. __IO uint32_t tmp = 0;
  29. tmp = (uint32_t)ADCx;
  30. tmp += ADC_InjectedChannel + JDAT_OFFSET;
  31. /* Returns the selected injected channel conversion data value */
  32. return (uint16_t)(*(__IO uint32_t*)tmp);
  33. }
  34. #define v_calc(sum, v, min, max) \
  35. do { \
  36. if (v > max) { \
  37. max = v; \
  38. } \
  39. if (v < min) { \
  40. min = v; \
  41. }\
  42. sum += v; \
  43. }while(0);
  44. static void __inline adc_phase_current_read(u8 phases, s32 *pv1, s32 *pv2) {
  45. #if (INJ_CHAN_NUM == 4)
  46. u16 min, max;
  47. u16 sum = 0;
  48. u16 v1 = ADC_GetInjectedDat(ADC1, ADC_INJ_CH_1);
  49. u16 v2 = ADC_GetInjectedDat(ADC1, ADC_INJ_CH_2);
  50. u16 v3 = ADC_GetInjectedDat(ADC1, ADC_INJ_CH_3);
  51. u16 v4 = ADC_GetInjectedDat(ADC1, ADC_INJ_CH_4);
  52. min = max = v1;
  53. sum += v1;
  54. v_calc(sum, v2, min, max);
  55. v_calc(sum, v3, min, max);
  56. v_calc(sum, v4, min, max);
  57. *pv1 = (s32) ((sum-min-max)/2.0f * adc_5vref_compesion());
  58. sum = 0;
  59. v1 = ADC_GetInjectedDat(ADC2, ADC_INJ_CH_1);
  60. v2 = ADC_GetInjectedDat(ADC2, ADC_INJ_CH_2);
  61. v3 = ADC_GetInjectedDat(ADC2, ADC_INJ_CH_3);
  62. v4 = ADC_GetInjectedDat(ADC2, ADC_INJ_CH_4);
  63. min = max = v1;
  64. sum += v1;
  65. v_calc(sum, v2, min, max);
  66. v_calc(sum, v3, min, max);
  67. v_calc(sum, v4, min, max);
  68. *pv2 = (s32) ((sum-min-max)/2.0f * adc_5vref_compesion());
  69. #else
  70. *pv1 = (s32)((float)ADC_GetInjectedDat(ADC1, ADC_INJ_CH_1) * adc_5vref_compesion());
  71. *pv2 = (s32)((float)ADC_GetInjectedDat(ADC2, ADC_INJ_CH_1) * adc_5vref_compesion());
  72. #endif
  73. }
  74. static void __inline adc_current_sample_config(u8 phases) {
  75. }
  76. static void __inline adc_disable_ext_trigger(void) {
  77. //ADC1->CTRL2 &= CTRL2_INJ_EXT_TRIG_RESET;
  78. }
  79. static void __inline adc_enable_ext_trigger(void) {
  80. //ADC1->CTRL2 |= CTRL2_INJ_EXT_TRIG_SET;
  81. }
  82. static __inline__ void adc_clear_irq_flags(void) {
  83. ADC1->STS = (~(uint32_t)ADC_FLAG_JENDC);
  84. ADC2->STS = (~(uint32_t)ADC_FLAG_JENDC);
  85. }
  86. static __inline void adc_update_ext_trigger(u32 trigger) {
  87. //ADC1->CTRL2 |= trigger;
  88. }
  89. void adc_init(void);
  90. s32 adc_sample_regular_channel(int chan, int times);
  91. void adc_start_convert(void);
  92. void adc_stop_convert(void);
  93. u16 adc_get_vbus(void);
  94. u16 adc_get_acc(void);
  95. u16 adc_get_throttle(void);
  96. void adc_get_uvw_phaseV(u16 *uvw);
  97. u16 adc_get_mos_temp(void);
  98. u16 adc_get_motor_temp(void);
  99. u16 adc_get_ibus(void);
  100. u16 adc_get_vref(void);
  101. void adc_set_vref_calc(float v);
  102. void adc_vref_filter(void);
  103. u16 adc_get_5v_ref(void);
  104. void adc_set_5vref_calc(float v);
  105. u16 adc_get_throttle2(void);
  106. u16 adc_get_thro_5v(void);
  107. u16 adc_get_thro2_5v(void);
  108. #endif /* _ADC_H__ */