電源網中DigiKey聯合NXP推出了免費硬件試用活動,我申請了FRDM-K32L3A6開發板的試用,幸運的獲得這次試用機會,這里非常感謝活動方。
這份紙質快速入門引導標注好了引出的io口以及板上的各種模塊,并且附帶了一根micro USB數據用于連接板上的調試器便于調試。
在NXP的官網上找到了對應開發板的鏈接://www.nxp.com.cn/design/design-center/development-boards-and-designs/FRDM-K32L3A6包含了所需的原理圖、數據手冊以及參考手冊等資料齊全,同時還有電子版的入門引導://www.nxp.com.cn/document/guide/getting-started-with-the-frdm-k32l3a6:NGS-FRDM-K32L3A6
這里包含到手后對硬件的測試,以及對開發環境的試用介紹,不僅是NXP官方的IDE還有MDK、IAR以及GCC,對新上手非常友好。
我使用的IDE是NXP官方的MCUXprosso IDE,集成了引腳、時鐘以及外設配置等功能,與我常用的stm32還有一些國產的32位MCU相比,外設更多更靈活也更加復雜,IDE配置工具也是更加靈活且復雜
如這里配置TPM,通過添加和啟用實例可以快速的去切換外設的配置
模擬變壓器的驅動:
void TPM0_IRQHANDLER(void) {
uint32_t intStatus;
intStatus = TPM_GetStatusFlags(TPM0_PERIPHERAL);
//溢出中斷后切換
if(TPM0->CONTROLS[0].CnV){
TPM0->CONTROLS[1].CnV = TPM0->MOD;
TPM0->CONTROLS[0].CnV = 0;
}else{
TPM0->CONTROLS[0].CnV = TPM0->MOD;
TPM0->CONTROLS[1].CnV = 0;
}
TPM_ClearStatusFlags(TPM0_PERIPHERAL, intStatus);
#if defined __CORTEX_M && (__CORTEX_M == 4U)
__DSB();
#endif
}
void lv_process(void){
static float softupCnt = 0.0f;
if(softupCnt < LV_PWM_PERIOD){
softupCnt++;
if(softupCnt >LV_PWM_PERIOD){
softupCnt = LV_PWM_PERIOD;
}
TPM0->CONTROLS[2].CnV = (uint32_t)(softupCnt);
TPM0->CONTROLS[3].CnV = (uint32_t)(softupCnt);
}else{
TPM0->CONTROLS[2].CnV = (uint32_t)(LV_PWM_PERIOD);
TPM0->CONTROLS[3].CnV = (uint32_t)(LV_PWM_PERIOD);
}
}
Spwm:
void inv_index_updata(void){
invObj.outputIndex++;
if(invObj.outputIndex >= invObj.MaxIndex){
invObj.outputIndex = 0;
invObj.polarity = !invObj.polarity;
if(!invObj.polarity){
invObj.flag_calculate = 1;
invObj.flag_updateOutput = 1;
}
}
}
void spwm_cal(void){
uint16_t tapIndex;
tapIndex = (uint16_t)(invObj.outputIndex * invObj.stepIndex + 0.5f);
if(tapIndex > 2000){
tapIndex = 0;
}
if(invObj.Vbus < 1){
return;
}
if(invObj.polarity){
TPM2->CONTROLS[0].CnV = (uint32_t)((invObj.taget * spwmData[tapIndex]) / invObj.Vbus * TPM2->MOD);
TPM2->CONTROLS[1].CnV = (uint32_t)((invObj.taget * spwmData[tapIndex]) / invObj.Vbus * TPM2->MOD);
TPM2->CONTROLS[2].CnV = 0;
TPM2->CONTROLS[3].CnV = 0;
}else{
TPM2->CONTROLS[0].CnV = TPM2->MOD - (uint32_t)((invObj.taget * spwmData[tapIndex]) / invObj.Vbus * TPM2->MOD);
TPM2->CONTROLS[1].CnV = TPM2->MOD - (uint32_t)((invObj.taget * spwmData[tapIndex]) / invObj.Vbus * TPM2->MOD);
TPM2->CONTROLS[2].CnV = TPM2->MOD;
TPM2->CONTROLS[3].CnV = TPM2->MOD;
}
}
運行效果如下:
這里的(ch0 ch1) (ch4 ch5) (ch6 ch7)使用互補輸出可以插入死區時間,避免驅動交錯而器件的損壞。
這里再次感謝活動方提供的試用機會!