请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:BOOSTXL-DRV8305EVM 主题中讨论的其他部件:C2000WARE,controlSUITE
设置:我正在使用C2000 28379D启动板和助推器组DRV8305EVM来实施我自己的控制算法。 启动板由EVM供电(我已移除所有JP1,2,3跳线)。 我使用C2000ware对启动板进行编程。 我使用了一个斩波器,使用了A相线的上部开关和 B相线的下部开关。
问题:我无法准确地感应增压器组件的DC链路电压(ENGATE高,NFAULT LED低)。 它显示4095而不是正确的值。 但是,如果启动板由USB供电,并且相应的引脚连接到8305EVM的VSENPVDD (连接两个板的接地引脚),则同一程序工作正常。
我希望能为解决这一问题提供任何帮助。 请在下面找到该计划
// //包含的文件 // #include "driverlib.h" #include "device.h" //// 定义 // 这些文件用于ADC #define EX_ADC_Resolution ADC_Resolution ADC_Resolution SYC_12bit //或ADC_Resolution SYBIT #define EX_ADC_SIGNAL_MODE ADC_MODE_SINGLE_END_END_/或ADC_MODEF_ADC_SYQ_CLK DEVICE #SYK / FREK //时基时钟是SYCLK /2 #define PWM_CLK 5000 #define PRD_VAL (TB_CLK /(PWM_CLK * 2)) //这些是用于ePWM #define EPWM1_TIMER_TBPRD 2000U #define EPWM1_CMP 1000U #define EPWM2_TIMER_TBPRD 2000U #define EPWM2_CMP 1000U //// GLOBALS // uint16_t adcAResult_Vdd; uint16_t interruptCount =0; uint16_t loopcount =0; //// 函数原型 ////这些 是用于ADC void initADC (void); void initADCs invoid ADCs (M1); //这些用于eint16_t loopcount = 0; void wmw/ wmisr;void = void wepmwmw/ void wmism) // //启动设备时钟和外围 // device_init(); // //禁用引脚锁并启用内部上拉。 // DEVICE_INITGPIO (); // //初始化饼图和清除饼图寄存器。 禁用CPU中断。 // interrup_initModule(); // //使用指向shell中断服务例程(ISR)的指针初始化PIE矢量表 // interrupT_initVectorTable(); // //设置ADC,初始化软件触发的SOC // initadCs(); initADCSOC(); // //在GPIO124上启用GPIO输出以清除增压器组件上的ENGATE // GPIO_setPadConfig (124,GPIO_PIN_TYPE_PLEUP);//在GPIO6上启用上拉 GPIO写入引脚(124,1); //加载输出闩锁 GPIO_setPinConfig (GPIO _124_GPIO124); // GPIO124 = GPIO124 GPIO_setDirectionMode (124,GPIO_DIR_MODE_OUT);// GPIO124 =输出 DEVICE_DELAY _US (1万); // //本示例中使用的中断被重新映射到ISR功能 //在此文件中找到 // 中断注册(INT_EPWM1,&epwm1ISR); 中断注册(INT_EPWM2,&epwm2ISR); // //将GPIO0/1,GPIO2/3和GPIO4/5配置为ePWM1A/1B,ePWM2A/2B和ePWM3A/3B // GPIO _setPadConfig (0,GPIO PIN类型标准); GPIO _setPinConfig (GPIO_0_EPWM1A); /*GPIO_setPadConfig (1,GPIO PIN_TYPE_STD); GPIO _setPinConfig (GPIO_1_EPWM1B);*/ /*GPIO_setPadConfig (2,GPIO PIN_TYPE_STD); GPIO _setPinConfig (GPIO_2_EPWM2A);*/ GPIO _setPadConfig (3,GPIO PIN_TYPE_STD); GPIO_setPinConfig (GPIO _3_EPWM2B); // //禁用同步(同时冻结时钟至PWM) // sysctl_disablePeripheral (sysctl_Periph_CLK_TBCLKSYNC); initEPWM1(); initEPWM2(); // //启用与PWM的同步和时钟 // sysctl_enablePeripheral (sysctl_Periph_CLK_TBCLKSYNC); // //启用ePWM中断 // INTERRUL_ENABLE (INT_EPWM1); INTERRUL_ENABLE (INT_EPWM2); // //启用全局中断(INTM)和实时中断(DBGM) // EINT; ERTM; // //无限循环 // 同时(1) { // //转换,等待完成和存储结果 // ADC_FORCESOC (ADCA_BASE,ADC_SOC_NUMBER0); // //等待ADCA完成,然后确认标志 // while (ADC_getInterruptStatus (ADCA_BASE,ADC_INT_NUMBER1)=false) { } ADC_clearInterruptStatus (ADCA_BASE,ADC_INT_NUMBER1); // //存储结果 // adcAResult_Vdd = ADC_readResult (ADCARESULT_BASE,ADC_SOC_NUMBER0); IF (循环计数> 8000) { ESTOP0; loopcount = 0; } loopcount = loopcount + 1; } }// 主 void initadC(void){ // //将ADCCLK除法器设置为/4 // ADC_setPrescaler (ADCA_BASE,ADC_CLK_DIV_4_0); // //设置分辨率和信号模式(参见上面的#defines)并加载相应的修正。 // ADC_setMode (ADCA_BASE,EX_ADC_Resolution,EX_ADC_SIGNAL_MODE); // //将脉冲位置设置为延迟 // ADC_setInterruptPulseMode (ADCA_BASE,ADC_PULSE_END_of_CONV); // //启动ADC,然后延迟1毫秒 // ADC_enableConverter (ADCA_BASE); device_delay_US(1000); } 作废initADCSOC(void){ // //配置ADCA #IF (EX_ADC_Resolution == ADC_Resolution _12位)的SOC ADC_setupSOC (ADCA_BASE,ADC_SOC_NUMBER0,ADC_TRIGG_SW_ONY,ADC_CH_ADCIN3,15); // a_v #Elif (EX_ADC_Resolution == ADC_Resolution _16BIT) ADC_setupSOC (ADCA_BASE,ADC_SOC_NUMBER0,ADC_TRIGG_SW_ONY,ADC_CH_ADCIN3,64); #endif // //设置SOC0以设置中断1标志。 启用中断并确保清除其标志。 // ADC_setInterruptSource (ADCA_BASE,ADC_INT_NUMBER1,ADC_SOC_NUMBER0); ADC_enableInterrupt (ADCA_BASE,ADC_INT_NUMBER1); ADC_clearInterruptStatus (ADCA_BASE,ADC_INT_NUMBER1); }//// initEPWM1 -配置ePWM1 // void initEPWM1() { // //设置TBCLK // ePWM_setTimeBasePeriod (EPWM1_BASE,EPWM1_TIMER_TBPRD); ePWM_setPhaseShift (EPWM1_BASE,0U); ePWM_setTimeBaseCounter (EPWM1_BASE,0U); //同步代码 ePWM_setSyncOutPulseMode (EPWM1_BASE,ePWM_SYNC_Out_PULSE_ON_counter_zero); // //设置比较值 // ePWM_setCounterCompareValue (EPWM1_BASE,ePWM_counter_compare_A,EPWM1_CMP); //ePWM_setCounterCompareValue (EPWM1_BASE,ePWM_counter_compare_B,EPWM1_MAX_CMBB); // //设置计数器模式 // ePWM_setTimeBaseCounterMode (EPWM1_BASE,ePWM_counter_mode_ue_down); ePWM_DisablePhaseShiftLoad (EPWM1_BASE); ePWM_setClockPrescaler (EPWM1_BASE,ePWM_Clock_diver_1,ePWM_HSCLOCK分配器_1); // //设置阴影 // ePWM_setCounterCompareShadowLoadMode (EPWM1_BASE,ePWM_counter_compare_A, ePWM_COMP_LOW_ON_CNTR_ZERO); /*ePWM_setCounterCompareShadowLoadMode (EPWM1_BASE,ePWM_counter_compare_B, ePWM_COMP_LOW_ON_CNTR_ZERO);*/ // //设置操作 // ePWM_setActionQualifierAction (EPWM1_base, ePWM_AQ_OUTPUT A, ePWM_AQ_OUTPUT高, ePWM_AQ_OUTPT_ON_TIMEBASE _UP_CMPA); ePWM_setActionQualifierAction (EPWM1_base, ePWM_AQ_OUTPUT A, ePWM_AQ_OUTPUT低, ePWM_AQ_OUTPT_ON_TIMEBASE向下_CMPA); /*ePWM_setActionQualifierAction(EPWM1_base, ePWM_AQ_OUTPUT B, ePWM_AQ_OUTPUT高, ePWM_AQ_OUTPT_ON_TIMEBASE _UP_CMBB); ePWM_setActionQualifierAction (EPWM1_base, ePWM_AQ_OUTPUT B, ePWM_AQ_OUTPUT低, ePWM_AQ_OUTPT_ON_TIMEBASE DON_CMBB);*/ // //中断,我们将在其中更改比较值 //选择INT on time base counter zero event, //启用INT,在第三个事件上生成INT // ePWM_setInterruptSource (EPWM1_BASE,ePWM_INT_TBCTR); ePWM_enableInterrupt (EPWM1_BASE); ePWM_setInterruptEventCount(EPWM1_base, 3U); }//// initEPWM2 -配置ePWM2 // void initEPWM2() { // //设置TBCLK // ePWM_setTimeBasePeriod (EPWM2_BASE,EPWM2_TIME_TBPRD); ePWM_setPhaseShift (EPWM2_BASE,0U); ePWM_setTimeBaseCounter (EPWM2_BASE,0U); //同步代码 ePWM_setCountModeAfterSync(EPWM2_base, ePWM_COUNT_MODE_UP_After_sync); ePWM_setSyncOutPulseMode (EPWM2_BASE,ePWM_SYNC_Out_PULSE_ON_counter_zero); // //设置比较值 // //ePWM_setCounterCompareValue (EPWM2_BASE,ePWM_counter_compare_A,EPWM2_CMP); ePWM_setCounterCompareValue (EPWM2_BASE,ePWM_counter_compare_B,EPWM2_CMP); // //设置计数器模式 // ePWM_setTimeBaseCounterMode (EPWM2_BASE,ePWM_counter_mode_ue_down); ePWM_enablePhaseShiftLoad(EPWM2_base); ePWM_setClockPrescaler (EPWM2_BASE,ePWM_Clock_diver_1,ePWM_HSCLOCK分配器_1); // //设置阴影 // /*ePWM_setCounterCompareShadowLoadMode (EPWM2_BASE,ePWM_counter_compare_A, ePWM_COMP_LOW_ON_CNTR_ZERO);*/ ePWM_setCounterCompareShadowLoadMode (EPWM2_BASE,ePWM_counter_compare_B, ePWM_COMP_LOW_ON_CNTR_ZERO); // //设置操作 // /*ePWM_setActionQualifierAction (EPWM2_BASE, ePWM_AQ_OUTPUT A, ePWM_AQ_OUTPUT高, ePWM_AQ_OUTPT_ON_TIMEBASE _UP_CMPA); ePWM_setActionQualifierAction(EPWM2_base, ePWM_AQ_OUTPUT A, ePWM_AQ_OUTPUT低, ePWM_AQ_OUTPT_ON_TIMEBASE DOWN CMPA);*/ ePWM_setActionQualifierAction(EPWM2_base, ePWM_AQ_OUTPUT B, ePWM_AQ_OUTPUT高, ePWM_AQ_OUTPT_ON_TIMEBASE _UP_CMBB); ePWM_setActionQualifierAction(EPWM2_base, ePWM_AQ_OUTPUT B, ePWM_AQ_OUTPUT低, ePWM_AQ_OUTPT_ON_TIMEBASE向下_CMBB); // //中断,我们将在其中更改比较值 //选择INT on time base counter zero event, //启用INT,在第三个事件上生成INT // ePWM_setInterruptSource (EPWM2_BASE,ePWM_INT_TBCTR); ePWM_enableInterrupt (EPWM2_BASE); ePWM_setInterruptEventCount (EPWM2_BASE,3U); }//// epwm1ISR-- ePWM 1 ISR // __interrupt void epwm1ISR(void) { // //清除此计时器的INT标志 // ePWM_clearEventTriggerInterruptFlag (EPWM1_BASE); // //确认中断组 // interrupT_clearACKGroup(interrupT_ACK_Group3); }//// epwm2ISR-- ePWM 2 ISR// __interrupt void epwm2ISR(void) { // //清除此计时器的INT标志 // ePWM_clearEventTriggerInterruptFlag (EPWM2_BASE); // //确认中断组 // interrupT_clearACKGroup(interrupT_ACK_Group3); }