【DigiKey&NXP】NXP FRDM-K32L3A6开发板 变压器驱动及SPWM输出

电源网中DigiKey联合NXP推出了免费硬件试用活动,我申请了FRDM-K32L3A6开发板的试用,幸运的获得这次试用机会,这里非常感谢活动方。

这份纸质快速入门引导标注好了引出的io口以及板上的各种模块,并且附带了一根micro USB数据用于连接板上的调试器便于调试。

在NXP的官网上可以找到对应开发板的原理图,以及数据手册和参考手册等资料,同时还有电子版的入门引导:

这里包含到手后对硬件的测试,以及对开发环境的试用介绍,不仅是NXP官方的IDE还有MDK、IAR以及GCC,对新上手非常友好。

我使用的IDE是NXP官方的 MCUXpresso 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;

}

}

运行效果如下:

视频演示
这里再次感谢活动方提供的试用机会!