This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/LAUNCHXL-F28069M:ePWM、ADC、所需中断

Guru**** 2242430 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/717165/ccs-launchxl-f28069m-epwm-adc-required-interrupts

器件型号:LAUNCHXL-F28069M

工具/软件:Code Composer Studio

大家好、我是 Mike、我读了这个问题、我想我也有同样的问题、我想使用 ePWM 或 ECAP 模块来同步 ADC SOC、有人、在 e2e 论坛中、 告诉我 ECAP 中断中的强制 SoC、但我根本无法获得合适的信号、我是否可以使用 ECAP 同步 EPWM 以使用此 EPWM 进行关联

此致、Mike

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用 ePWM 来触发 SOC 最简单、因为它可以在硬件中完成(无需像使用 eCAP 那样的转换的软件强制)。 如果您想查看一些示例代码、F2806x 的 ADC_temp_sensorTM 示例使用 ePWM 来触发转换。

    这是否适合您? 我不明白为什么您认为应该使用 eCAP……? 您能更详细地解释一下这种情况吗?

    谢谢、
    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的惠特尼、我一直在使用一些设置、如 ADC_TEMP_SENSOR 中所示。 这就是显示方式。

    这是输入。  

    正如您看到的、波形存在一些失真。  如果我更改频率、该信号会失真更大、我实际上知道(除了我错了)这种失真可以由循环缓冲器的性质来实现、也是 因为我没有针对接近信号频率的某些值调整 TBPRD 和 CMPA 值。 但这是诀窍。 在我的应用中、我将测量来自发电机涡轮机的输出信号。 波形的频率根本无法稳定、这就是我考虑使用 ECAP 的原因、因为对于该信号(如上所示)、我创建了过零电路。  

    这是波形

      

    我想使用方波信号来同步 SOC、以改善测量结果。

    下一个图像是我看到的与我正在生成的代码(代码在那里)相关的信号。

    谢谢

    Mike

    我将向您分享这个代码、我实际上使用的是这个代码。

    #include "libreria.h"
    uint32 pwmDuty;
    uint32 pwmPeriod;
    _IQ Periodo;
    _IQ Frecuencia;
    // Declaración de 变量 Globales*/
    long ADC_1;
    int16 ADC_Buffer[700];
    int32 ADC_Buffer2[700];
    _IQ ADC_buer3;
    _IQ 缓冲区;_IQ
    _IQ ADC_Buffer4;
    Int32 ADC_BufferVDC;
    _IQ ADC_buff_VDC2;
    _IQ RMS;
    _IQ RMS1;
    _IQ RMS2;
    _IQ RMS3;
    _IQ rms;
    _IQ DC;
    _IQ DC_ERROR;
    _IQ DC1;
    uint16 conv;
    uint16 contt;
    uint16 i;
    uint16 zc;
    float freq;
    uint16 zcmac;
    
    __interrupt void ADC_ISR (void);
    __interrupt void ECAP_ISR (void);
    //#define Device_cal (void (*)(void)) 0x3D7C80
    
    
    void frecuencia (void)
    {
    EALLOW; //f ü Emulación de registros
    SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1; // SYSCLKOUT para habilitar eCAP1
    // se inicia el módulo ECAP para medir el periodo y el ancho de Pulso de una señal ó n。
    ECap1Regs.ECEINT.ALL = 0; // Desrabilita todas las interruciones del módulo eCAP
    ECap1Regs.ECCTL1.bit.CAPLDEN = 0; //结果面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Detiene el contador
    ECap1Regs.TSCTR = 0; // Limpia el contador
    ECap1Regs.CTRPHS = 0; // Limpia el registro de contador de fase
    ECap1Regs.ECCTL2.bit.CAP_APWM = 0; // Mdo Captura
    ECap1Regs.ECCTL2.bit.SWSYNC = 1; // Sincronización forzada del contador por 软件,siniza crontodas las Bases de tiempo del ECAP
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = 10; // Syncin = SyncOut、querido POR SWSYNC
    ECap1Regs.ECCTL2.bit.SYNCI_EN = 1; // Deshabilita sincronización de entrada
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; //时间戳计数器自由运行
    ECap1Regs.ECCTL2.bit.rearm = 0; //无重设(重设->安全保护
    ECap1Regs.ECCTL2.bit.STOP_Wrap = 11; // Toma 4 capturas en modo continue.
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0; // operando en modo continuo
    ECap1Regs.ECCTL1.bit.FREE_SOFT= 11; //时间戳计数器 no es afectado por le emulación suspendida
    ECap1Regs.ECCTL1.bit.prescale = 00000; //除法器入口1.
    ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Habitila los registros de carga CAP1-4 en un evento
    ECap1Regs.ECCTL1.bit.CTRST4 = 0; //正弦重置 en la primera captura
    ECap1Regs.ECCTL1.bit.CAP4POL=1; // Captura en el ascenso de la señal ó n
    ECap1Regs.ECCTL1.bit.CTRST3 = 0; // Sin reset en la segunda captura
    ECap1Regs.ECCTL1.bit.CAP3POL=0; // Captura en el descenso de la señal ó n
    ECap1Regs.ECCTL1.bit.CTRST2 = 0; //正弦重置 en la tercera captura
    ECap1Regs.ECCTL1.bit.CAP2POL=1; // Captura en el ascenso de la señal ó n
    ECap1Regs.ECCTL1.bit.CTRST1 = 0; //正重置为 la cuala captura
    ECap1Regs.ECCTL1.bit.CAP1POL=0; // Captura en el descenso de la señal ó n
    // Habilitia la emulación ó n de registros
    PieVectTable.ECAP1_INT =&ECAP_ISR; // El contenido del subprograma de interrupción "ECAP_ISR" es copiado por el subprograma de interrupción "ECAP1_INT" contenido en la tabla.
    ECap1Regs.ECEINT.ALL = 0x0008; // Habitilia las interruciones
    PieCtrlRegs.PIEIER4.bit.INTx1 = 1; // Habitila la interrupción ó n de ECAP1_INT en PIE grupo 4.
    IER |= 0x0008; // Habitila int4 en IER para itar r é rupo 4 del bloque de interruption
    EINT;
    ERTM;
    GpioCtrlRegs.GPACTRL.ALL = 0x00000000;
    GpioCtrlRegs.GPAMUX2.bit.GPIO24=1; // GPIO 24配置器参数 captura de pulos
    GpioCtrlRegs.GPADIR.bit.GPIO24 = 0; // GPIO 24 como entrada
    GpioCtrlRegs.GPAPUD.bit.GPIO24=0; //上拉电阻器参数 GPIO24 (0)
    //GpioCtrlRegs.GPAPUD.bit.GPIO24=1; //上拉电阻器配置参数 GPIO24 (1)
    EDIS;
    }
    
    void voltaje_rms (void)
    {
    对于(i=0;i<701;i++) // Ciclo 用于参数化 ADC_Buffer con un arreglo de 0
    {
    ADC_Buffer[I]=0;
    }
    对于(i=0;i<701;i++) // Ciclo for para inicializar ADC_Buffer2 con un arreglo de 0
    {
    ADC_Buffer2[i]= 0;
    }
    EALLOW; // Habilitia la emulación ó n de registros
    PieVectTable.ADCINT1 =&ADC_ISR;// El contenido del subprograma de interrupción "ADC_ISR" es copiado por el subprograma de interrupción "ADCINT1" contenido en la tabla.
    InitAdc(); //初始化 el módulo del ADC
    AdcOffsetSelfCal(); // Ajuste de offset del ADC debido a su construcción
    (*Device_cal)(); // Ajuste de error de ganancia debido a la construcción ó n del ADC
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// Habilitia la Interrupción 1.1 en el Puerto de expansión è re de interruciones
    IER |= M_INT1; // Habitila la interrupción 1 del CPU
    EINT; // Habitilia las interruciones globales
    ERTM; //使用 tiempo Real 的 Habilitia las interruciones
    EDIS; // Deshabilita la emulación ó n de registros
    conv=0; //可变附加定义、临时、长整型 del Buffer
    EALLOW; // Habilitia la emulación ó n de registros
    //EPwm1Regs.TBCTL.bit.PHSEN = 1;
    GpioCtrlRegs.AIOMUX1.bit.AIO10 = 2;// GPIO 26 enabilitado para funciones Analógicas
    AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;// Habilit性 el moto de sobre apamiento de muestras
    AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;// Control de Pulso generador de interrupción -> 0 = inicio de conversión ó n、1 = UN ciclo POR resultado
    AdcRegs.INTSEL1N2.bit.INT1E = 1; // Habilit性 ADCINT1
    AdcRegs.INTSEL1N2.bit.INT1CONT = 0;// Mdo de interruptiones continuas desrabilitado -> 0= Pulso generado si la Bandera es limpiada por SW、1=Pulso generado cada EOC
    AdcRegs.INTSEL1N2.bit.INT1SEL = 1; //最终转换1 (EOC 1)对 ADCINT1进行贬低(触发)
    
    AdcRegs.ADCSOC0CTL.bit.CHSEL = 10; // inicio de conversión 0 (SOC) para el cCanal ADCINB2 (引脚26)
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM 1 es el madio para SOC1
    AdcRegs.ADCSOC0CTL.bit.ACQPS = 8; // Ventana de Sample/Holding a 10 ciclos del reloj del ADC
    
    AdcRegs.ADCSOC1CTL.bit.CHSEL = 10; // inicio de conversión 0 (SOC) para el cCanal ADCINB2 (引脚26)
    AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;// ePWM 1 es el madio para SOC1
    AdcRegs.ADCSOC1CTL.bit.ACQPS = 8; // Ventana de Sample/Holding a 10 ciclos del reloj del ADC
    
    AdcRegs.ADCSOC2CTL.bit.CHSEL = 10; // inicio de conversión 0 (SOC) para el cCanal ADCINB2 (引脚26)
    AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;// ePWM 1 es el madio para SOC1
    AdcRegs.ADCSOC2CTL.bit.ACQPS = 8; // Ventana de Sample/Holding a 10 ciclos del reloj del ADC
    
    
    AdcRegs.ADCSOC3CTL.bit.CHSEL = 10; // inicio de conversión 0 (SOC) para el cCanal ADCIN1 (引脚26)
    AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 5;// ePWM 1 es el madio para SOC1
    AdcRegs.ADCSOC3CTL.bit.ACQPS = 8; // Ventana de 采样/保持一个10 ciclos del reloj del ADC
    //* EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 4; //从 CPMA 上数选择 SOC
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
    EPwm1Regs.CMPA.half-CMPA = 0x0080;//设置比较 A 值
    EPwm1Regs.TBPRD = 0xFFFF;//为 ePWM1设置周期
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;* //向上计数并启动
    EPwm1Regs.TBCTL.bit.CTRMODE = 0x3; // Temporizador 的 Deshabilita el Temporizador
    EPwm1Regs.TBCTL.ALL = 0xC033;
    EPwm1Regs.TBCTR = 0x0000; //临时旅馆的林皮亚旅馆
    EPwm1Regs.TBPRD = 10416;
    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;//临时解决方案配置
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; // selección ó n de registros para Eventos de dimpo -> dimulos en SOC a habilitados
    EPwm1Regs.ETSEL.bit.SOCASEL = 4; // selección ó n de SOC en la comparación ó n del contador ascente de A
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generación de SOC al primer evento
    EPwm1Regs.TBCTL.bit.CTRMODE = 0x0;
    asm (" EALLOW"); //启用 EALLOW 受保护寄存器访问
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;// TBCLK 至 ePWM 模块被启用
    asm (" EDIS");
    
    }
    
    void main (void)
    {// inicio función principal
    
    // Este bloque de programación ó n va al inicio de cualquier programa
    /******** 闪存 /
    国际振荡1Sel(); //对 DSP F28069进行初始化
    InitPll (DSP28_PLLCR、DSP28_DIVSEL);//Iniciza el PLL del DSP28069M、además ó n de desabilitar el watchdog、estos es ec必要 的参数 el archivo de inicialización "F2806x_CodeStartBranch.asm"
    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadEnd);// manipulación de bloque de memia:El contenido de RamfuncsLoadStart
    // se copia en RamfuncsRunStart,la rostadad de bytes copiados lo define
    // el tamaño de RamfuncsLoadEnd。 estas acciones las reiza el enlazador (F28069M.cmd)
    InitFlash(); //初始化 las funciones para copiar el programa a la memoria Flash/
    ********* /
    InitSysCtrl();//初始化 el Sistema de Control:PLL、WD、外设时钟。
    Dint; //对 CPU 进行断路
    InitPieCtrl();// Iniciza los registros de control del Puerto de Interrupciones Expandido a sus Estado predeterminado
    IER = 0x0000;// Deshabiita las interruptiones del CPU
    IFR = 0x0000;// Limpia las Bandas de interrupción del CPU
    InitPieVectTable();//Iniciza la tabla de arreglos de interrupción ó n, las interruciones utilizadas son remapeadas en esta función ó n
    弗雷库西亚();
    voltaje_rms();
    
    
    GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0;// MUX -> GPIO
    GpioDataRegs.GPBCLEAR.bit.GPIO39 = 1;// Salida en Estado bajo antes de configurar el pin como Salida、Mdo Drenador (SINK)。 咨询 spruh18g.pdf (pág 120)
    GpioCtrlRegs.GPBDIR.bit.GPIO39 = 1;// GPIO39 como salida
    EDIS; // Deshabilita la emulación ó n de registros/*
    
    for (;;)
    {// inicio de for
    EALLOW; // Habilitia la emulación ó n de registros
    GpioDataRegs.GPBSET.BIO39 = 1;//引脚 Modo Fuente (来源)ó Alto
    DELAY_US (100000); // intervero de tiempo de 0.1 s
    GpioDataRegs.GPBCLEAR.bit.GPIO39 = 1;//引脚 MODO Sumidero (SINK)ó 低电平
    DELAY_US (100000); // intervero de tiempo de 0.1 s
    EDIS; // emulación ó n de registros
    }// Fin de for
    
    
    }// Fin de función ó n principal
    
    // FIN de programación ó n EN la flash"*/
    
    _interrupt void
    ADC_ISR (void)// inicio del programa de interrupción
    ó n{
    
    ADC_Buffer[conv]= AdcResult.ADCRESULT3-0x0628; // cada espacio o localidad del arreglo es llenado con el resultado del registro AdcResult 1.
    ADC_Buffer2[conv]= pow (ADC_Buffer[conv]、2);// VRMS se Eleva al Cuadrado cada Dato ingresado en el buffer *
    ADC_BufferVDC += ADC_Buffer[conv]; /* vdc se hace una suma de toos los datos ingados en el buffer*/
    ADC_buf_sum += ADC_Buffer2[conv]; /* VRMS se hace una suma de toos datos elevados al Cuadrado que ingresaron al buffer*/
    如果(conv == 699) // Si la variable conv si es igual a la longitud del buffer menos uno reiza los algoritmos de VDC y VRMS y despues se reicia
    {
    ADC_Buffer3 = ADC_buf_Sum/conv+1.0; /* VRMS La suma de los datos evelados al cuadro del ADC es sedr分 之一 la longitud del buffer */
    ADC_buff_VDC2 = ADC_BufferVDC/conv+1.0;/* VDC La suma de los datos del ADC 对一个入口的长度 del buffer 进行分段*
    DC =(3.3*ADC_buff VDC2)/4096.0; /* VDC se multiplica el promedio de los datos por un factor de conversión y se tiene el valor DC de la señal muestreada */
    //DC_ERROR=DC1-1.29;
    //DC=DC1-DC_ERROR;
    ADC_Buffer4 = sqrt (ADC_Buffer3); /* VRMS se obtiene la raíz ó n cuadrada de la división ó n (Sumarita/longitud_Buffer)*/
    RMS=ADC_Buffer4*(3.3/4096.0)*1060.0; /* VRMS se multiplica el resultado de la raíz ó n cuadrada por el factor de conversión ó n y se obtiene el valor RMS de la señal ó n muestreada *
    CONV = 0.0; /* El contador auxiliar del buffer se reinicia */
    ADC_BufferVDC=0.0; /* El contenido de la suma de todos los datos del buffer se Iguala a cero,con el fin de evitar sobre apamiento de datos *
    ADC_buf_Sum = 0.0; /* El contenido de la suma del Cuadrado de todos los datos del buffer se Iguala a cero,con el fin de evitar sobre apamiento de datos */
    } // realización del voltaje de offset
    其他 // Si la 变量 conv no es igual a la longitud del buffer menos uno entones incumenta en uno
    {
    conv++;
    }
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Limpia la Bandera de interrupción ó n del ADC
    PieCtrlRegs.PIEACK.ALL = PIEACK_Group1;// El bloque de expansido de interrupción ó n de perifericos reconoce una interrupción en el grupo 1.
    //返回;
    
    }// fin del subprgrama de interrupción
    
    __interrupt void
    ECAP_ISR (void)
    {
    
    PieCtrlRegs.PIEACX.ALL = PIEACK_group4; //进行重建以显示饼图
    ECap1Regs.ECCLR.bit.INT = 1; // Limpia l Bandera de interrupción ó n de ECAP1.
    ECap1Regs.ECCLR.bit.CEVT3 = 1; // Limpia l Bandera de CEVT3
    // Calcula el ciclo de trabajo (flanco ascendente a flanco desendente)
    // PwmDuty =(int32)ECap1Regs.CAP2 -(int32)ECap1Regs.CAP1;
    // Calcula el periento (flascendente)
    PwmPeriod =(Int32) ECap1Regs.CAP3 -(Int32) ECap1Regs.CAP1;
    periodo =(PwmPeriod/90401640.0);
    frecuencia = 1/Periodo;
    } 




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很困惑、但我找到了一个解决方案、在 spruh18g.pdf 中检查固件镜像我使用一些 ePWM 寄存器来比较 TBPRD、然后是转换开始、这个比较非常小、我正在打破奈奎斯特所说的。