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.
工具/软件:Code Composer Studio
大家好、我是 Mike、我读了这个问题、我想我也有同样的问题、我想使用 ePWM 或 ECAP 模块来同步 ADC SOC、有人、在 e2e 论坛中、 告诉我 ECAP 中断中的强制 SoC、但我根本无法获得合适的信号、我是否可以使用 ECAP 同步 EPWM 以使用此 EPWM 进行关联
此致、Mike
尊敬的惠特尼、我一直在使用一些设置、如 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; }