最新电影在线观看,jrs低调看直播,avav天堂,囯产精品宾馆在线精品酒店,亚洲精品成人区在线观看

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

【DigiKey NXP】: FRDM-K32L3A6試用 變壓器驅動及SPWM輸出

電源網中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)使用互補輸出可以插入死區時間,避免驅動交錯而器件的損壞。

 

這里再次感謝活動方提供的試用機會!

全部回復(0)
正序查看
倒序查看
現在還沒有回復呢,說說你的想法