本帖最后由 jixulifu2 于 2024-11-17 23:54 编辑
一、DSP的ADC的过人之处:
在涉及模拟信号到数字信号转换的场景中。ADC(模数转换器)模块扮演着至关重要的角色。使用DSP做电力电子项目相对于传统性能孱弱的32单片机我总结了以下几个优势:
1.在电力电子系统中,需要对各种模拟信号(如电压、电流等)进行实时采集和处理。DSP的ADC模块可以快速、准确地将这些模拟信号转换为数字信号,供后续的数字信号处理算法使用。例如,HXS320F28025C的ADC模块可以实现高精度的模数转换,支持多种触发方式,EPWM SOCA触发,确保在特定时刻进行采样。
2.电力电子系统中的控制策略通常需要实时反馈和调整。DSP的ADC模块可以提供高精度和高频率的采样,使得控制算法能够基于最新的系统状态进行调整。例如,在逆变器控制中,通过ADC采集的电流和电压信号可以用于实现精确的闭环控制,提高系统的稳定性和效率。
3.电力系统中的电力质量监测是一个重要的应用领域。DSP的ADC模块可以用于实时监测电网的电压和电流波形,检测谐波、电压波动、频率偏差等问题。通过高速ADC采集的数据,DSP可以快速执行傅里叶变换(FFT)等算法,分析电网的电力质量。
4.在电力电子设备中,故障检测和保护是确保系统安全运行的关键。DSP的ADC模块可以实时监测关键参数,如电流、电压和温度,一旦检测到异常,可以立即触发保护机制。例如,通过逐波限流控制技术,DSP可以快速响应过载和短路情况,保护设备免受损坏。
二、中科昊芯HXS320的ADC了解:
12 位逐次逼近(SAR)型 ADC。包括通道选择 MUX、 采样保持(S/H)电路、 逐次逼近电路、 电压参考电路和其他模拟支持电路。 包装器由配置和控制 ADC 的数字电路组成。 这些电路
包括可编程转换逻辑、 结果寄存器、 模拟电路接口、 外设总线接口、 后处理电路以及其他片上模块接口。
每个 ADC 都具有以下功能:
•由 VREFHI 和 VREFLO 引脚设置的比率外部参考
•2.5V 或 3.3V 的可选内部参考
•单端信号转换
•输入多路复用器, 多达 16 个通道( 单端) 或 8 个通道( 差分)
•16 个可配置 SOC
•16 个可单独寻址的结果寄存器
•多个触发源
-S/W-软件立即启动
-所有 ePWMs-ADCSOC A 或 B
-GPIO XINT2
-CPU 计时器 0/1/2
-ADCINT1/2
•四个灵活的 PIE 中断
•突发模式
•四个后处理块, 每个块具有:
-饱和偏移校准
-设定点计算错误
-高、 低和过零比较, 具有中断和 ePWM 跳闸功能
-触发采样延迟捕获
最基础的EPWM触发ADC配置代码:
void Adc_config(void)
{
/*ADC参考电压配置为:ADC_REFERENCE_INTERNAL-内部参考电压,
* ADC_REFERENCE_3_3V-3.3V*/
ADC_setVREF(ADCA_BASE,ADC_REFERENCE_INTERNAL,ADC_REFERENCE_3_3V);
/*配置ADC时钟为ADC_CLK_DIV_2_0-2分频对应SYSCLK/8=20M*/
ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_8_0);
/*配置ADC中断脉冲模式:ADC_PULSE_END_OF_CONV-转换完成产生脉冲触发中断*/
ADC_setInterruptPulseMode(ADCA_BASE, ADC_PULSE_END_OF_CONV);
/*ADC上电使能转换*/
ADC_enableConverter(ADCA_BASE);
/*延时1ms完成ADC模块上电*/
DEVICE_DELAY_US(5000);
/*屏蔽ADC突发模式*/
ADC_disableBurstMode(ADCA_BASE);
/*配置ADC_SOC转换优先级:ADC_PRI_ALL_ROUND_ROBIN-从A0开始循环转换*/
ADC_setSOCPriority(ADCA_BASE, ADC_PRI_ALL_ROUND_ROBIN);
/*配置SOC:ADC_SOC_NUMBER0-SOC0,
* ADC_TRIGGER_EPWM1_SOCA-通过EPWM_SOCA触发
* ADC_CH_ADCIN0-通过通道A0输入采样,
* 采样周期为8*SYSCLK(最大512*SYSCLK)*/
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2,
ADC_TRIGGER_EPWM1_SOCA, ADC_CH_ADCIN0, 8U);
/*配置SOC0触发源:ADC_INT_SOC_TRIGGER_NONE-不通过ADCINT内部触发*/
ADC_setInterruptSOCTrigger(ADCA_BASE, ADC_SOC_NUMBER2, ADC_INT_SOC_TRIGGER_NONE);
/*配置ADC_SOC_NUMBER0-SOC0中断源为ADC_INT_NUMBER1-ADCINT1*/
ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER2);
/*配置ADC_INT_NUMBER1-ADCINT1中断使能*/
ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
/*清除ADC_INT_NUMBER1-ADCINT1中断状态*/
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
/*屏蔽ADC_INT_NUMBER1-ADCINT1连续模式*/
ADC_disableContinuousMode(ADCA_BASE, ADC_INT_NUMBER1);
}
最常用的ADC配置就不研究了,常用的32单片机碰到过压过流时,软件处理的方式对于时间的需求还是太高,不能做到瞬时响应,硬件过流检测又需要添加调试更多的电路,而HXS320内置了这种错误联防机制,可以第一时间切换EPWM输出,防止损坏器。
我们来看看例程中带有错误联防安全机制的配置
void main(void)
{
/*系统时钟初始化*/
Device_init();
/*GPIO锁定配置解除*/
Device_initGPIO();
/*关中断,清中断*/
Interrupt_initModule();
/*初始化中断向量表*/
Interrupt_initVectorTable();
/*中断入口地址INT_ADCA1,指向执行adcA1ISR中断服务程序*/
Interrupt_register(INT_ADCA1, &adcA1ISR);
#ifdef ENABLE_PROFILING
//
// Setup profiling GPIO
//
setupProfileGpio();
#endif
/*配置EPWM_GPIO*/
initEPWMGPIO();
/*配置ADC模块电压:ADC_REFERENCE_INTERNAL-内部参考电压
*ADC_REFERENCE_3_3V-参考电压3.3V */
ADC_setVREF(ADCA_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
ADC_setVREF(ADCC_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
/*ADC模块上电配置*/
configureADC(ADCA_BASE);
/*关闭外设时钟TBCLKSYNC,以便于EPWM配置*/
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
/*配置EPWM1-EPWM3频率及SOC事件*/
EPWM_configureSignal(EPWM1_BASE, &pwmSignal1);
EPWM_configureSignal(EPWM2_BASE, &pwmSignal2);
EPWM_configureSignal(EPWM3_BASE, &pwmSignal3);
/*单次错误联防事件配置*/
configureOSHTripSignal(EPWM1_BASE);
/*周期错误联防事件配置*/
configureCBCTripSignal(EPWM2_BASE);
/*直接事件触发配置*/
configureDirectTripSignal(EPWM3_BASE);
/*配置ADC_SOC*/
configureADCSOC(ADCA_BASE, 2U, 8);
/*配置极限探测PPB后处理:SOC0,
* 高极限-3600-对应3.3V*3600/4096=2.9V
* 低极限-0-对应3.3V*0/4096=0V*/
configureLimitDetectionPPB(0U, 3600U, 0U);
/*中断使能INT_ADCA1*/
Interrupt_enable(INT_ADCA1);
/*实时打开全局中断*/
EINT;
ERTM;
/*使能外设时钟TBCLKSYNC,以完成EPWM配置,且时基同步*/
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
/*ADC_SOC_NUMBER0-SOC0通过软件强制触发*/
ADC_forceSOC(ADCA_BASE, ADC_SOC_NUMBER0);
do
{}
while(1);
}
void configureOSHTripSignal(uint32_t epwmBase)
{
/*配置XBAR_EPWM_MUX00_ADCAEVT1-EPWM_ADC复用事件
* 通过XBAR_TRIP7-事件7交叉开关输入*/
XBAR_setEPWMMuxConfig(XBAR_TRIP7, XBAR_EPWM_MUX00_ADCAEVT1);
/*使能XBAR_TRIP7-事件7交叉开关输入
* 通过XBAR_MUX00-交叉开关0输入*/
XBAR_enableEPWMMux(XBAR_TRIP7, XBAR_MUX00);
/*选择数据比较事件DC输入:
* 通过EPWM_DC_TRIP_TRIPIN7-事件7
* 触发EPWM_DC_TYPE_DCAH-DCAH事件*/
EPWM_selectDigitalCompareTripInput(epwmBase,
EPWM_DC_TRIP_TRIPIN7,EPWM_DC_TYPE_DCAH);
/*产生数字比较事件DCAEVT1的条件配置:
* EPWM_TZ_DC_OUTPUT_A1-EPWMxA_DCAEVT1
* EPWM_TZ_EVENT_DCXH_HIGH-DCAH置高*/
EPWM_setTripZoneDigitalCompareEventCondition(epwmBase,
EPWM_TZ_DC_OUTPUT_A1,EPWM_TZ_EVENT_DCXH_HIGH);
/*EPWM数字比较事件源:EPWM_DC_MODULE_A-DC事件A模块
*EPWM_DC_EVENT_1-DCAEVT1事件
*EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL-不经过滤波的原信号*/
EPWM_setDigitalCompareEventSource(epwmBase,
EPWM_DC_MODULE_A,EPWM_DC_EVENT_1,
EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL);
/*EPWM数字比较事件源同步:EPWM_DC_MODULE_A-DC事件A模块
*EPWM_DC_EVENT_1-DCAEVT1事件
*EPWM_DC_EVENT_INPUT_NOT_SYNCED-采用异步信号输入*/
EPWM_setDigitalCompareEventSyncMode( epwmBase,
EPWM_DC_MODULE_A,EPWM_DC_EVENT_1,
EPWM_DC_EVENT_INPUT_NOT_SYNCED);
/*TZ错误联防信号EPWM_TZ_SIGNAL_DCAEVT1使能*/
EPWM_enableTripZoneSignals(epwmBase, EPWM_TZ_SIGNAL_DCAEVT1);
/*TZ错误联防事件动作配置:
* EPWM_TZ_ACTION_EVENT_TZA-对于EPWMxA
* EPWM_TZ_ACTION_LOW-产生置低动作*/
EPWM_setTripZoneAction(epwmBase,
EPWM_TZ_ACTION_EVENT_TZA,
EPWM_TZ_ACTION_LOW);
/*TZ错误联防事件动作配置:
* EPWM_TZ_ACTION_EVENT_TZB-对于EPWMxB
* EPWM_TZ_ACTION_HIGH-产生置高动作*/
EPWM_setTripZoneAction(epwmBase,
EPWM_TZ_ACTION_EVENT_TZB,
EPWM_TZ_ACTION_HIGH);
/*清除TZ错误联防事件EPWM_TZ_FLAG_DCAEVT1标志*/
EPWM_clearTripZoneFlag(epwmBase, EPWM_TZ_FLAG_DCAEVT1);
/*清除TZ错误联防事件EPWM_TZ_OST_FLAG_DCAEVT1-单次触发标志*/
EPWM_clearOneShotTripZoneFlag(epwmBase, EPWM_TZ_OST_FLAG_DCAEVT1);
/*TZ错误联防事件中断类型:EPWM_TZ_INTERRUPT_OST-单次错误联防中断*/
EPWM_enableTripZoneInterrupt(epwmBase, EPWM_TZ_INTERRUPT_OST);
}
通过XBAR将ADC与PWM信号切断相联动
下载程序进开发板
AI0低于2.9V时EPWM输出5khz 占空比CMPA=70%,CMPB=50%,短接AI0与VCC后,触发联防,为低电平