phase_current.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "hal/adc.h"
  2. #include "foc_type.h"
  3. static float __inline adc_to_current(u32 adc){
  4. int i_adc = (int)adc;
  5. if (i_adc > INT16_MAX){
  6. i_adc = INT16_MAX;
  7. }else if (i_adc < -INT16_MAX) {
  8. i_adc = - INT16_MAX;
  9. }
  10. return (i_adc/4095.0f * 3.3f / 0.001f);
  11. }
  12. void get_phase_current(current_samp_t *cs){
  13. u32 phase_current1, phase_current2;
  14. HAL_ADC1_Inject_Read(cs->sector, &phase_current1, &phase_current2);
  15. if (cs->sector == SECTOR_4 || cs->sector == SECTOR_5) {
  16. /* Current on Phase C is not accessible */
  17. /* Ia = PhaseAOffset - ADC converted value) */
  18. cs->ia = adc_to_current(phase_current1 - cs->adc_offset_a);
  19. cs->ib = adc_to_current(phase_current2 - cs->adc_offset_b);
  20. cs->ic = -(cs->ia + cs->ib);
  21. }else if (cs->sector == SECTOR_1 || cs->sector == SECTOR_6) {
  22. /* Current on Phase A is not accessible */
  23. /* Ib = PhaseBOffset - ADC converted value) */
  24. cs->ib = adc_to_current(phase_current1 - cs->adc_offset_b);
  25. cs->ic = adc_to_current(phase_current2 - cs->adc_offset_c);
  26. cs->ia = -(cs->ib + cs->ic);
  27. }else if (cs->sector == SECTOR_2 || cs->sector == SECTOR_3) {
  28. /* Current on Phase B is not accessible */
  29. /* Ia = PhaseAOffset - ADC converted value) */
  30. cs->ia = adc_to_current(phase_current1 - cs->adc_offset_a);
  31. cs->ic = adc_to_current(phase_current2 - cs->adc_offset_c);
  32. cs->ib = -(cs->ia + cs->ic);
  33. }
  34. }
  35. u32 get_phase_sample_point(current_samp_t *cs, phase_time_t *time, u8 sector){
  36. u32 low_side_low_duty = FOC_PWM_period/2 - time->low;
  37. cs->sector = sector;
  38. if (low_side_low_duty > (TDead + MAX(TRise, TNoise))) {
  39. cs->sector = SECTOR_5;
  40. return FOC_PWM_period/2 - 1;
  41. }
  42. u32 low_side_mid_duty = FOC_PWM_period/2 - time->midle;
  43. u32 delta_duty = low_side_mid_duty - low_side_low_duty;
  44. if (delta_duty > low_side_low_duty * 2) {
  45. return time->low - TADC;
  46. }
  47. u32 sample_point = time->low + (TDead + MAX(TRise, TNoise));
  48. if (sample_point >= FOC_PWM_period/2) {
  49. /* ADC trigger edge must be changed from positive to negative */
  50. cs->adc_inject_flags= (uint16_t) LL_ADC_INJ_TRIG_EXT_FALLING;
  51. sample_point = ( 2u * FOC_PWM_period / 2 ) - sample_point - (uint16_t) 1;
  52. }
  53. return sample_point;
  54. }
  55. void phase_current_adc_triger(current_samp_t *cs){
  56. HAL_ADC1_Inject_Config(cs->sector, cs->adc_inject_flags);
  57. cs->adc_inject_flags = LL_ADC_INJ_TRIG_EXT_RISING;
  58. }