目錄
- 一、STM32G4 電機外設篇(二) VOFA + ADC + OPAMP
- 1 VOFA
- 1.1 VOFA上位機顯示波形
- 2 ADC
- 2.1 用ADC規則組對板載電壓和電位器進行采樣
- 3 OPAMP(運放)
- 3.1 結合STM32內部運放和ADC來完成對三相電流的采樣
- 3.2 運放電路分析
- 附學習參考網址
- 歡迎大家有問題評論交流 (* ^ ω ^)
一、STM32G4 電機外設篇(二) VOFA + ADC + OPAMP
1 VOFA
1.1 VOFA上位機顯示波形
- 通訊協議
- JustFoat 只上傳浮點數,0000807f結尾
因為用DMA傳輸數據,更快 - FireWater 只用printf實現,比較慢
- JustFoat 只上傳浮點數,0000807f結尾
- 這里選用第一種方式來實現
- 打開之前文章生成的Keil
在/* USER CODE BEGIN PV */中添加如下代碼
extern DMA_HandleTypeDef hdma_usart3_tx;
uint8_t DataB1[32] = "LED1 Toggle\r\n";
uint8_t DataB2[32] = "LED2 Toggle\r\n";
uint8_t DataB3[32] = "LED1 and LED2 open\r\n";#define RXBUFFERSIZE 256
char RxBuffer[RXBUFFERSIZE];
uint8_t aRxBuffer;
uint8_t Uart1_Rx_Cnt;float temp[1];
static uint8_t tempData[8] = {0, 0, 0, 0, 0, 0, 0x80, 0x7F};
在 /* USER CODE BEGIN WHILE */中添加如下代碼
while(1)
{temp[0] += 0.01f;if(temp[0] > 6.28f){temp[0] = 0;}// printf("%f\r\n",temp[0]);memcpy(tempData, (uint8_t *)&temp, sizeof(temp));HAL_UART_Transmit_DMA(&huart3, (uint8_t *)tempData, 8);HAL_Delay(1);
}
- 按照之前的文章進行接線,然后編譯下載程序
- 打開vofa+,按照圖片操作連接串口,點擊控件按鈕,拖入左側表格控件,右鍵添加Y軸數據,滾輪調整圖標,就可以獲得如圖所示波形
- 可以用這個軟件的一些其它控件來調整電機的Kp Ki,做出一個電機的控制窗口
2 ADC
2.1 用ADC規則組對板載電壓和電位器進行采樣
- ADC是整個電機控制中非常重要的外設,涉及到母線電壓(VBUS)和三相電流的采樣,這兩者直接作用于電機控制的FOC環路,直接影響電機的運行穩定
- ADC的分類
- SAR ADC
- sigma delta ADC
- 前者是逐次逼近的方法測值的,更快;后者是多次疊加的方法測量的,更加精準
- ADC有單端輸入和差分輸入模式,差分輸入模式在sigma delta ADC使用的更多,此處選擇單端輸入
- 配置ADC1和ADC2時鐘四分屏,12bit精度和右對齊
- ADC1和ADC2使能規則組轉換
- 點擊生成代碼,打開Keil工程
在/* USER CODE BEGIN 2 */中添加如下代碼
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer, 1);
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);//自校驗,減少采樣誤差
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);/* USER CODE END 2 */
- 在/* USER CODE BEGIN PV */中修改
float temp[2];
static uint8_t tempData[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x7F};
/* USER CODE END PV */
- 在/* USER CODE BEGIN WHILE */中修改
while(1)
{HAL_ADC_Start(&hadc1);HAL_ADC_Start(&hadc2);temp[0] = HAL_ADC_GetValue(&hadc1);temp[1] = HAL_ADC_GetValue(&hadc2) * 0.02094726f; //根據分壓電阻計算memcpy(tempData, (uint8_t *)&temp, sizeof(temp));HAL_UART_Transmit_DMA(&huart3, (uint8_t *)tempData, 12);HAL_Delay(1);}/* USER CODE END WHILE */
- VBUS在采樣的時候一般要增加低通濾波器,電機在旋轉的時候,母線電容一直處于充放電狀態,大負載啟動的時候,會有瞬時的母線電壓補到母線電容中會導致波動,后面的實驗會增加這個濾波器
- 編譯下載程序
- 打開vofa上位機,復位開發板,連接上位機,實際效果如圖所示
3 OPAMP(運放)
3.1 結合STM32內部運放和ADC來完成對三相電流的采樣
-
打開之前的stm32cubemx項目
-
使能三個運放
- standalone模式,增益是外置的(選這個)
- follower 跟隨模式
- PGA 可編程增益模式,增益可以用軟件更改
-
使能兩個ADC中斷
-
ADC配置,使能采樣通道,使能注入組
-
點擊生成代碼,打開Keil軟件
-
使能運放,在112行左右插入代碼
/* USER CODE BEGIN 2 */HAL_OPAMP_Start(&hopamp1);HAL_OPAMP_Start(&hopamp2);HAL_OPAMP_Start(&hopamp3);
- 在 /* USER CODE BEGIN WHILE */的while循環中插入如下代碼
HAL_ADCEx_InjectedStart_IT(&hadc1);
HAL_ADCEx_InjectedStart_IT(&hadc2);//使能規則組轉換,并產生注入組中斷
- 在USER CODE 4中添加如下代碼
//注入中斷處理程序
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
{/*Prevent unused argument(s)compilation warning */UNUSED (hadc);if(hadc == &hadc1){temp[2] = hadc1.Instance->JDR1;temp[2] = (temp[2]-0x7ef)*0.193359375f;temp[3] = hadc1.Instance->JDR2;temp[3] = (temp[3]-0x7ef)*0.193359375f;}if(hadc == &hadc2){temp[4] = hadc1.Instance->JDR1;temp[4] = (temp[4]-0x7ef)*0.193359375f;}
}
3.2 運放電路分析
- R58,R59 作用是為了輸入的正向端和負向端輸入阻抗匹配
- R52,R53 為分壓電阻,作用是將輸入正向端電壓正向偏置1.65V
- R56與 R59 形成負反饋增益,運放整體增益計算如下
- 虛斷:OP1_VINP 輸入電壓為 Vin;
- 虛短:
V i n R 59 = V o u t R 59 + R 56 \frac{Vin}{R59} = \frac{Vout}{R59 + R56} R59Vin?=R59+R56Vout?
增益 G a i n = V o u t V i n = 1 + R 56 R 59 增益Gain = \frac{Vout}{Vin} = 1 + \frac{R56}{R59} 增益Gain=VinVout?=1+R59R56?
- 修改Temp數組為5大小,修改DMA傳輸24bit
- 編譯下載程序,實驗結果如下
附學習參考網址
- STM32G4 FOC開發實戰
- SAR ADC和sigma delta ADC的區別-CSDN博客
- 【運放2】如何理解運放的虛短虛斷,他們有啥用?_嗶哩嗶哩_bilibili
歡迎大家有問題評論交流 (* ^ ω ^)
- 如果板子有時候沒反應就把電源都拔了重新接線上電,說不定就好了QAQ