电源网中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;
}
}
运行效果如下:
视频演示
这里再次感谢活动方提供的试用机会!


