ADC.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /**
  2. * @copyright None
  3. * @file ADC.c
  4. * @author Comment Vivre
  5. * @date 2025-11-03
  6. * @brief None
  7. */
  8. #include <MyProject.h>
  9. /**
  10. @function VREF_Config_Init
  11. @brief 基准电压配置
  12. @date 2025-11-01
  13. */
  14. void VREF_Config_Init(void)
  15. {
  16. // 基准电压配置
  17. #if (HW_ADC_VREF == VREF3_0)
  18. SetReg(VREF_VHALF_CR, VRVSEL1 | VRVSEL0, VRVSEL1);
  19. #elif (HW_ADC_VREF == VREF4_0)
  20. SetBit(VREF_VHALF_CR, VRVSEL1 | VRVSEL0);
  21. #elif (HW_ADC_VREF == VREF4_5)
  22. ClrBit(VREF_VHALF_CR, VRVSEL1 | VRVSEL0);
  23. #elif (HW_ADC_VREF == VREF5_0)
  24. SetReg(VREF_VHALF_CR, VRVSEL1 | VRVSEL0, VRVSEL0);
  25. #endif
  26. // 基准电压输出滤波控制
  27. SetBit(P3_AN, PIN5);
  28. SetBit(P3_OE, PIN5);
  29. // VHALF 输出滤波配置
  30. SetBit(P3_AN, P32);
  31. // 基准电压与VHALF使能
  32. SetBit(VREF_VHALF_CR, VREFEN | VHALFEN);
  33. }
  34. /**
  35. @function ADC_Init
  36. @brief ADC端口初始化
  37. @date 2025-11-01
  38. */
  39. void ADC_Init(void)
  40. {
  41. // 母线电压 三相交流电压 模块温度 4-20mA电流采集
  42. SetBit(P2_AN, PIN4 | PIN5 | PIN6 | PIN7);
  43. // NTC1 NTC2
  44. SetBit(P3_AN, PIN3 | PIN4);
  45. // 通道使能
  46. SetBit(ADC_MASK, CH0EN | CH1EN);
  47. SetBit(ADC_MASK, CH2EN | CH3EN | CH4EN | CH6EN | CH7EN | CH11EN);
  48. // 数据左对齐 (自动左移4位)
  49. SetBit(ADC_CR, ADCALIGN);
  50. ClrBit(ADC_CR, ADCIE);
  51. SetBit(ADC_CR, ADCEN);
  52. }
  53. /**
  54. @function AMP_Init
  55. @brief 运放初始化 外部增益 配置AMP1 AMP2
  56. @date 2025-11-01
  57. */
  58. void AMP_Init(void)
  59. {
  60. // AMP1 配置
  61. SetBit(P1_AN, P16);
  62. SetBit(P1_AN, P17);
  63. SetBit(P2_AN, P20);
  64. // AMP2 配置
  65. SetBit(P2_AN, P21);
  66. SetBit(P2_AN, P22);
  67. SetBit(P2_AN, P23);
  68. // P23_OE需要强制为0,禁止DA1输出至PAD
  69. ClrBit(P2_OE, P23);
  70. // 使能AMP1 AMP2
  71. SetBit(AMP_CR0, AMP1EN | AMP2EN);
  72. // 增益为外部配置
  73. ClrBit(AMP_CR1, AMP0_GAIN2 | AMP0_GAIN1 | AMP0_GAIN0 | AMP_PH_GAIN2 | AMP_PH_GAIN1 | AMP_PH_GAIN0);
  74. }
  75. uint16_t uCurr, vCurr;
  76. /**
  77. @function Get_ADC_Value
  78. @brief 读取ADC转换值
  79. @date 2025-11-03
  80. */
  81. void Get_ADC_Value(void)
  82. {
  83. // 使能ADC的DCBUS采样
  84. SetBit(ADC_CR, ADCBSY);
  85. // 等待转换完成
  86. while (ReadBit(ADC_CR, ADCBSY));
  87. // 读取数据
  88. motorControl.DCBus = LPF_Zero_Update(VDCBUS_ADC, motorControl.DCBus, LPF_K(5.0));
  89. motorControl.ACBus = LPF_Zero_Update(VACBUS_ADC, motorControl.ACBus, LPF_K(1.0));
  90. motorControl.IGBTTemp = LPF_Zero_Update(IGBT_NTC_ADC, motorControl.IGBTTemp, LPF_K(20.0));
  91. // 数据处理
  92. // 测试
  93. uCurr = ADC0_DR;
  94. vCurr = ADC1_DR;
  95. motorControl.uPhaseCurr = uCurr - mcCurOffset.IuOffset;
  96. motorControl.vPhaseCurr = vCurr - mcCurOffset.IvOffset;
  97. }