手寫STM32 FOC記錄-----pwm觸發(fā)adc電流采樣
PWM的配置詳見上一章節(jié)。
ADC配置需要使用 PWM 和 ADC 的同步機制,ADC 的采樣由 TIM1 的 CCR4在 0 矢量中心附近觸發(fā):
?

?
首先配置三相電流和母線電壓的ADC通道,此處根據(jù)硬件平臺原理圖去配置
?

?

?
然后是ADC基本配置
?


全部默認即可,說明一下,使用CubeMX配置ADC,使用注入組就用不到規(guī)則組。
?

?

這里配置比較關鍵,重點是以下幾項,詳細說明下:
Number Of Conversions :使用到注入組的通道個數(shù)3
External Trigger Source :外部觸發(fā)源,使用前邊說的定時器1的通道四作為觸發(fā)源。
External Trigger Edge :外部觸發(fā)極性,選擇下降沿
Injected Rank :這個就是注入序列,一旦ADC開始注入轉換,就會按照Rank1-2-3-4的順序依次進行采樣,每個rank只能選擇一個對應的通道。每個通道對應ADC輸入引腳
Sampling Time :采樣時間,因為foc電流采樣是一個分秒必爭的過程,所以采樣時間盡可能的要短。
其他配置均默認即可。
?
最后配置一個測試IO口,每次AD采集就翻轉一下IO狀態(tài),便于使用示波器測試ADC的采樣時間點。CubeMX生成代碼。
?

? 還是跟上一章節(jié)一樣,做一個測試文件,將要測試的模塊都在測試文件中實現(xiàn),在主函數(shù)中調用需要測試的模塊即可。在測試文件中添加test_PWM_ADC_init,主函數(shù)調用

?void test_PWM_ADC_init(void)??
{
?
?HAL_TIM_Base_Start(&htim1);
?HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
?HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
?HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
?HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
?HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
?HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
?HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0.2*PWM_PERIOD);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0.2*PWM_PERIOD);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0);
HAL_ADCEx_InjectedStart(&hadc1);
HAL_ADCEx_InjectedStart(&hadc2);
__HAL_ADC_ENABLE_IT(&hadc1, ADC_IT_JEOC);
__HAL_ADC_ENABLE_IT(&hadc2, ADC_IT_JEOC);
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,PWM_PERIOD-1); ?//TIM1通道4的PWM配置 ?關聯(lián)ADC采樣時間 // 在PWM波的正中間采樣
}
?

在中斷文件stm32g4xx_it.c中ADC1_2_IRQHandler處添加測試引腳翻轉函數(shù),測試ADC的采樣時間點
?

完成以上操作之后,就可以下載到板子中測試了。測試方法是,使用三根示波器表筆,分別接一路PWM,PWMN,TEST_PIN,波形顯示如下圖:
?

上圖中,黃線是PWM,藍線為PWMN,紫線為測試引腳波形??梢钥闯?,ADC 中斷采樣周期和 PWM 周期一致。
最后一步就是測試ADC是否配置成功,看看ADC能否采集到數(shù)據(jù)。
?

uint16_t PA1_adc_value,PB11_adc_value,PA0_adc_value,PA7_adc_value;
void test_get_ADC_value(void)
{
PA1_adc_value = HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_1);
PB11_adc_value = HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2);
PA0_adc_value = HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_3);
PA7_adc_value = HAL_ADCEx_InjectedGetValue(&hadc2,ADC_INJECTED_RANK_1);
?
}
編寫測試接口函數(shù)test_get_ADC_value,將其放到中斷文件stm32g4xx_it.c中ADC1_2_IRQHandler處調用。
?

?
仿真看看讀取到的變量結果,如果我們將這個通道連接到VCC,數(shù)據(jù)會變成0x0FFF左右,接到GND,數(shù)據(jù)變成0x0000。
?

以上工程源代碼,包括cubemx 生成的ioc文件都可以開源,有需要的小伙伴記得點贊之后私信喲