Thread 中讨论的其他器件:EK-TM4C1294XL
工具与软件:
您好!
我将使用 TM4C1294NCPDT 的 ADC 端口来读取分压器的电压、其中分压器的 R1 (顶部的电阻器)
为1千欧姆、R2 (底部的电阻器)为0.2欧姆分流电阻器。 从我从微控制器手册中读到的内容、
当基准为3.3V 时、ADC 引脚可以读取高于805.66微伏的电压。
分压器的结果是970.3微伏、但在编译程序时、似乎自调试以来引脚上没有电压
编程并观察我指定变量的值、结果为随机电压值、当我使用万用表确认时
计算器电压(约为1mV)。
我要使用的引脚是引脚20、对应于 ADC 的 PK2和通道18。 我最终想用负载和同时监控 PK0和 PK1
类似于我现在要测试的电压。
您能给我什么建议来复习一下吗?
此致、
Mayra#include <stdint.h> #include <stdbool.h> #include <string.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_gpio.h" #include "driverlib/sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/gpio.h" #include "driverlib/adc.h" #include "driverlib/debug.h" #include <driverlib/uart.h> #include <driverlib/interrupt.h> #include "inc/hw_ints.h" //librería para interrupciones #include <stdbool.h> #include "utils/uartstdio.h" #include "utils/uartstdio.c" #define NORM_MSG_LEN 26 #define ERR_MSG_LEN 8 uint32_t g_ui32SysClock; //variable para configurar el reloj del microcontrolador uint32_t ui32Status; uint32_t buffer_ADC[24]; // arreglo para guardar datos entrantes del ADC uint32_t buffer_ADC2[24]; // arreglo para guardar datos entrantes del ADC float V_in=0.0; float V_medido=0.0; float I_Carga=0.0; float V_in2=0.0; float V_Carga=0.0; int G_ina=2; float arregloV[3]; //arreglo para guardar los datos de voltaje de la carga float arregloI[3]; //arreglo para guardar los datos de corriente de la carga //------------------------------------------------------------------------------------------------------------------ // ADC //------------------------------------------------------------------------------------------------------------------ //función de autoria propia void INIT_ADC() //inicializa el ADC { SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); //habilita el periferico para ADC0 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); //habilita el periferico D para termistores y monitoreo de potencia SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK); //habilita el periferico K para monitoreo de potencia while(!SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)); GPIOPinTypeADC(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); //PINES PARA ENTRADA ADC0 para termistores y monitoreo de voltaje y corriente GPIOPinTypeADC(GPIO_PORTK_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); //PINES PARA ENTRADA ADC0 para monitoreo de corriente } //------------------------------------------------------------------------------------------------------------------ // CARGAS //------------------------------------------------------------------------------------------------------------------ //FUNCION QUE OBTIENE LA CORRIENTE DE LAS CARGAS void CARGAS_ADC_I() //CONFIGURA LOS CANALES DE ADC PARA CADA CARGA { int i_adc, y=0; // for(i_adc=256; i_adc<259; i_adc++) // { ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR,0); ADCSequenceStepConfigure(ADC0_BASE, 0,0, ADC_CTL_CH18);//(paso 1) ADCSequenceStepConfigure(ADC0_BASE, 0,1, ADC_CTL_CH18);//(paso 2) ADCSequenceStepConfigure(ADC0_BASE, 0,2, ADC_CTL_CH18);//(paso 3) ADCSequenceStepConfigure(ADC0_BASE, 0,3, ADC_CTL_CH18);//(paso 4) ADCSequenceStepConfigure(ADC0_BASE, 0,4, ADC_CTL_CH18);//(paso 5) ADCSequenceStepConfigure(ADC0_BASE, 0,5, ADC_CTL_CH18);//(paso 6) ADCSequenceStepConfigure(ADC0_BASE, 0,6, ADC_CTL_CH18);//(paso 7) ADCSequenceStepConfigure(ADC0_BASE, 0,7, ADC_CTL_CH18|ADC_CTL_IE|ADC_CTL_END);//(paso 8) ADCSequenceEnable(ADC0_BASE,0); ADCIntClear(ADC0_BASE,0); //limpia las banderas de interrupción del ADC ADCProcessorTrigger(ADC0_BASE,0); //Causa un trigger para una secuencia de muestreo while(!ADCIntStatus(ADC0_BASE,0,false)) //indica el estado de las interrupciones { } ADCSequenceDataGet(ADC0_BASE,0,buffer_ADC2);//obtiene los datos capturados por el adc V_in=(buffer_ADC2[0]+buffer_ADC2[1]+buffer_ADC2[2]+buffer_ADC2[3]+buffer_ADC2[4]+buffer_ADC2[5]+buffer_ADC2[6]+buffer_ADC2[7]); V_in=(V_in)/8; V_medido=V_in*(3.3/4096); I_Carga=(V_medido/0.2); arregloI[y]=I_Carga; // y++; //} } void CARGAS_ADC_V() //CONFIGURA LOS CANALES DE ADC PARA CADA CARGA { int i_adc2, y2=0; for(i_adc2=13; i_adc2<16; i_adc2++) { ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR,0); ADCSequenceStepConfigure(ADC0_BASE, 0,0, i_adc2);//(paso 1) ADCSequenceStepConfigure(ADC0_BASE, 0,1, i_adc2);//(paso 2) ADCSequenceStepConfigure(ADC0_BASE, 0,2, i_adc2);//(paso 3) ADCSequenceStepConfigure(ADC0_BASE, 0,3, i_adc2);//(paso 4) ADCSequenceStepConfigure(ADC0_BASE, 0,4, i_adc2);//(paso 5) ADCSequenceStepConfigure(ADC0_BASE, 0,5, i_adc2);//(paso 6) ADCSequenceStepConfigure(ADC0_BASE, 0,6, i_adc2);//(paso 7) ADCSequenceStepConfigure(ADC0_BASE, 0,7, i_adc2|ADC_CTL_IE|ADC_CTL_END);//(paso 8) ADCSequenceEnable(ADC0_BASE,0); ADCIntClear(ADC0_BASE,0); //limpia las banderas de interrupción del ADC ADCProcessorTrigger(ADC0_BASE,0); //Causa un trigger para una secuencia de muestreo while(!ADCIntStatus(ADC0_BASE,0,false)) //indica el estado de las interrupciones { } ADCSequenceDataGet(ADC0_BASE,0,buffer_ADC);//obtiene los datos capturados por el adc V_in2=(buffer_ADC[0]+buffer_ADC[1]+buffer_ADC[2]+buffer_ADC[3]+buffer_ADC[4]+buffer_ADC[5]+buffer_ADC[6]+buffer_ADC[7])/8; V_Carga=(V_in2); //aqui hubo breakpoint V_Carga= V_Carga*(3.3/4096); V_Carga = (V_Carga*1358)/358; arregloV[y2]=V_Carga; //aqui hubo breakpoint y2++; } } //---------------------------------------------------------------------------------------------------------------------------- // MAIN //---------------------------------------------------------------------------------------------------------------------------- int main(void) { //configurar el reloj del microcontrolador g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |SYSCTL_USE_PLL |SYSCTL_CFG_VCO_240), 120000000);//120 MHz INIT_ADC(); //inicializa el ADC while(1) { //configura las caracteristicas de las funciones de ADC del micro y procesa los datos entrantes a temperatura CARGAS_ADC_I(); CARGAS_ADC_V(); SysCtlDelay(21000000);//514ms } }