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.
工具与软件:
您好!
我将使用 TM4C1294NCPDT 的 ADC 端口来读取分压器的电压、其中分压器的 R1 (顶部的电阻器)
为1千欧姆、R2 (底部的电阻器)为0.2欧姆分流电阻器。 从我从微控制器手册中读到的内容、
当基准为3.3V 时、ADC 引脚可以读取高于805.66微伏的电压。
分压器的结果是970.3微伏、但在编译程序时、似乎自调试以来引脚上没有电压
编程并观察我指定变量的值、结果为随机电压值、当我使用万用表确认时
计算器电压(约为1mV)。
我要使用的引脚是引脚20、对应于 ADC 的 PK2和通道18。 我最终想用负载和同时监控 PK0和 PK1
类似于我现在要测试的电压。
您能给我什么建议来复习一下吗?
此致、
MayraFullscreen123456789101112131415161718192021#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"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#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 } }
您好!
我有一些反馈和问题。
您从 buffer_ADC2[0]+buffer_ADC2[1]+buffer_ADC2[2]+buffer_ADC2[3]+buffer_ADC2[4]+buffer_ADC2[5]+buffer_ADC2[6]+buffer_ADC2[7]中读取的8个值是多少? 它们都是随机的吗?
您是否尝试过0v、1.65v 和3.3V 作为输入? 我只是想确保您的软件正常。 通过查看您的代码、我没有发现任何问题。
这是您的定制电路板吗?
您是否试用过 LaunchPad? 结果如何?
您的 VDDA 电源是否稳定?
如果您使用定制电路板、是否已尝试使用稳定的外部 VREF 而不是内部基准。 确保外部 Vref 稳定。
最后、请参阅有关线性误差的 ADC 电气规格。 您的测量值可能处于线性误差规格之内。 但是、如果您的测量值按幅度完全偏离、则情况将有所不同。
您好! 感谢您的答复。
是的、我在 buffer_adc 阵列中读取的数据是随机值、就像我没有读取电压一样。
对于3.3V 的值、ADC 读数会"读取"该值、我可以在保存该值的变量中看到3.3;对于1.65V、您也可以读取该值、尽管该值不稳定、您可以标记1.65、1.70、1.75等、但所有值均约为1.65、我尚未使用0V 进行测试、我会执行测试并发送结果。
是的、我将微控制器焊接在我设计的 PCB 上、我在 LaunchPad 上对其进行了测试、结果相同、我无法读取电压。
3.3V 电源稳定、我将尝试使用外部基准进行测试。
我曾尝试读取10mV 至3.3V 的电压、但只能读取大于50mV 的电压、但读数范围在40mV 至70mV 之间。
您好!
是的、请提供0V 的额外结果。 另请尝试简单 ADC 示例 C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\adc\single_end.c 在 PE3上按原样尝试。 您看到问题了吗? 修改 PK2的示例。 你看到 PE3和 PK2之间有很大的变化吗?
您好!
我已经尝试使用0V 作为输入、我附加 buffer_ADC 中数据的图像(2)
以及转换后对应的值(1)。
我还尝试了 Tiva 示例、但是结果是相同的、它没有读取如此小的电压、
无论是 PE3还是 PK0、我都没有使用 SS3、SS2和 SS0、但没有令人满意的结果。

此致、
Mayra
尊敬的 Mayra:
这可能与源阻抗有关。 您能否 检查1MSPS 转换速率下的 Rs 是否不超过500欧姆。 有可能是采样时间不够、那么之前一个通道转换在采样电容上留下的电荷会影响当前被转换的通道的精度。 您可能需要尝试在 ADC 引脚到接地端之间添加一个大电容器、以降低 ADC 看到的源阻抗、以便内部采样电容器可以快速充电。 前面也提到过、尝试使用外部 Vref 来查看是否可以按照数据表中的规定改善结果和 ADC 固有的线性误差。
您好!
打扰一下、您能举个例子来说明如何检查 Rs 吗?
此致、
Mayra
您可以在输入端创建电压并测量通过它的电流。 V/I 将为您提供电阻。
您好!
对不起,我想我不理解这个想法很好,
我已使用值为1000欧姆的负载电阻器、
0.2欧姆的分流电阻器在分压器配置中
该分压器接入5V 电压以在分压器中获得1mV 输出电压、
在代码中、我使用该值进行电压到电流的转换
INA233的寄存器读数。 因为我的电路旨在间接测量
负载电阻器的电流消耗。
我已经使用一个值为1000欧姆的负载电阻器、
这可能就是问题所在。 为什么不创建5V 至3.3V 的分压器并将您的输入电压馈送到 ADC? 无论什么情况、我都建议您进行实验、 暂时移除您的电阻器网络、然后直接将0V 馈入输入、看看这是否会改善您的结果。 这将告诉您的输入阻抗是否导致 ADC 稳定时间恶化。
您好!
我已经尝试将+VREFA 引脚连接到外部基准、
不能正常工作、我直接在引脚上为引脚提供了3.3V 和0V 电压(中间没有0.2欧姆分流电阻器)
它也不起作用。 该 ADC 可以读取大约200mV 的电压、但不能读取非常小的电压。
此致、
Mayra
尊敬的 Mayra:
您能展示一下原理图吗?
如果您有一块电路板、可以在另一块电路板上进行同样的测试吗?
如果您没有另一个板需要测试、是否可以将另一个 MCU 更换为您的板?
您可以绘制0V 至3.3V 的 ADC 值与输入电压曲线吗?
您好!
我正在发送原理图、目前我正在测试引脚19。
我无法在另一个卡上测试微控制器、
但我之前在德州的 TM4C1294XL LaunchPad 上尝试过相同的操作
但它也不起作用、当时我认为微控制器已损坏、
但显然情况并非如此。




您好!
如果您只是将 PK2绑定到 GND、仍将收到意外数据?
您能否绘制0V 至1V 范围内的曲线图?
我无法在另一张卡上测试微控制器、
[报价]如果没有其他卡、可以在 ABA 测试中尝试在同一卡上使用不同的 MCU。
您好!
目前我没有另一个微控制器或另一个 PCB:(
我已经尝试将 PK2接地、不涉及分流电阻、结果是相同的。
我将尝试在引脚上放置一个电容器、您可以提供一个值吗? 我计划放置1uF
电容器、我还将寻找一种使图形从0变为1并生成3.3V 的方法。
此致、
Mayra
我已经尝试将 PK2接地、不涉及分流电阻、结果是相同的。 我将尝试在引脚上放置一个电容器、您可以提供一个值吗? 我计划放置1uF
电容器、我还将寻找一种使图形从0变为1并达到3.3V 的方法。
您可以尝试1uF、但我怀疑它会产生很大的差异、因为您已经提供了直流0V。 话虽如此、我的确想指出的是、对于低电压输入、非线性误差通常会更大。
下面的链接对此进行了一些讨论。
https://electronics.stackexchange.com/questions/226931/adc-error-for-low-voltage-measurements
由于低电压输入是问题所在、因此我想确保您拥有干净的 GNDA、并且理想情况下、它是与 GND 分开的电源轨。 我希望您不要把它们联系在一起。
您好!
我已经进行了将引脚连接到0伏的测试、结果如屏幕截图中所示。
它没有给出绝对零。 我仍然无法绘制从0到3.3V 的值
此致、
Mayra
尊敬的 Mayra:
您能否说明一下您是否拥有干净的 GNDA?
您好!
"你说什么?"文龙不解地问道。 我的想法是、如果 GND 确实标记了0伏、则是"干净 GND"、
如果我的想法正确、是的、我已经测量过、是的、GND 为0伏。 如果我将任何 ADC 引脚连接到 GND、
读数不是0伏、但好像没有任何东西连接到引脚一样。
我添加了一个值表、其中对使用万用表和测得的电压值进行了比较
代码编写器读取的电压值。
我使用1k 欧姆的电位器改变了电压。
例如、对于在万用表上测得的值102mV、Code Composer 记录的值介于80mV 到102mV 之间。
对于使用万用表测量的201mV 值、Code Composer 将值标记为185到214mV。
(我没有考虑 Code Composer 代码转换中的所有小数点。
此致、
Mayra.
用万用表测量的输入电压 | 记录在 Code Composer 中 |
18毫伏 | 不确定 |
20mV | 不确定 |
30.1mv | 不确定 |
40.3mv | 不确定 |
50.6mv | 不确定 |
60.5毫伏 | 不确定 |
70.05mv | 不确定 |
80.05mv | 不确定 |
90.06mv | 不确定 |
102.2mv | 80mV - 102mv |
121.4mv | 107mv - 127mv |
140.7mv | 127 - 150mV |
161.7mv | 130-180mv |
184mv | 175-199mv |
201mv | 185-214mv |
220mV | 213mv - 225mv |
241mv | 228-265mv |
265mv | 262-278mV |
283mv | 266-288mV |
306mv | 304-319mv |
321mv | 319-334mv |
340mv | 335-367mv |
361mv | 350-377mv |
380mv | 371-398mv |
406mv | 404-422mv |
502mv | 501-520mv |
601mv | 599-621mv |
707mv | 720-738 MV |
804mv | 810-830mv |
900mv | 917-930mv |
1V | 1.03-1.047V |
1.107V | 1.120-1.150V |
1.2V | 1.236~1.250V |
1.3V | 1.33-1.41V |
1.4V | 1.43-1.50V |
1.5V | 1.53-1.52V |
1.6V | 1.64-1.65V |
1.72V | 1.775V |
1.8V | 1.85V |
1.9V | 1.95-1.96V |
2V | 2.1V |
2.1V | 2.145-2.16V |
2.2V | 2.26V |
2.3V | 2.36-3.55V |
2.41V | 2.46-2.48V |
2.51V | 2.56-2.600V |
2.61V | 2.66-2.68V |
2.7V | 2.78-2.79V |
2.8V | 2.85-2.87V |
2.9V | 2.97-2.98V |
3.01V | 3.09V |
3.1V | 3.18V |
3.2V. | 3.29V |
3.25V | 3.29V |
"清净 GNDA"一词具体是什么意思? 我的想法是、如果 GND 确实标记了0伏、则是"干净的 GND"、
我说的是 GNDA。 请参阅下面的引脚10端子。 当我说 Clean GNDA 时、我是说 GNDA 是否与 GND 分离。 GNDA 是 ADC 的专用接地。 为了获得最佳精度、您还要将 VDDA 与 VDD 分开、以更大限度地减少耦合到 VDDA 的 VDD 上的数字噪声。 拥有稳定/纯净的 VDDA 和 GNDA 将产生出色的 ADC 结果。 假设 VREF 连接到 VDDA。 降低 VDDA 上的电压也意味着 VREF 也会下降。 这会减小 ADC 的转换范围和步长。 例如、如果 VDDA 最初为3.6V、则范围为 VDDA-GNDA = 3.6V。 步长为3.6/4095 = 879uV/步长。 如果 VDDA 突然下降到3V、则步长现在为732.6uV/步长。 这就是为什么我说要避免在定制电路板上将 VDDA 连接到 VDD 的原因。 即使 VDDA 发生更改、源信号分辨率也不会改变、因此在较低的 VREF 电压(例如3V)下、输入信号阶跃将与734uV/阶跃进行比较。 步长方面的位宽度会减小、但任何输入信号噪声都保持不变、这使得低电压下的线性度更差。
我再次认为您可以通过以下方式提高准确度:
-使用连接到 VDDA 的外部 VREF
-将 VDDA 和 GNDA 与 VDD 和 GND 分离,因此没有数字噪声耦合
-添加过滤器盖。 输入桥臂通常表示具有阻抗的源(通常是阻性电容和并联电容)、并由滤波电容和其他寄生电容表示。 然后、串联 RC 将在内部连接到内部 ADC 输入、该输入也由串联开关电阻(通常为几百欧姆)和采样电容器(几个 PFS)表示、因此实际上有2个串联的 RC 滤波器。 滤波电容器的大小将决定采样电容器的充电速度。
-在 PCB 上使用 ADC 输入的短迹线。 我以前没有问过这个问题。 您的 PCB 上的输入迹线如何?
- 添加缓冲器单位增益缓冲器驱动器将外部阻抗与 ADC 的输入隔离,同时允许采样时间最小。
最后、请参阅数据表中指定的最大线性误差、为3LSB。
您好!
在 PCB 设计中、我的电路在跟随器(缓冲器)配置中具有运算放大器、
我还尝试了使用负载电阻器获得小电压、大约为毫伏、我计算出了
一个带有3.9k 欧姆分流电阻和800k 欧姆负载电阻的分压器、
我也没有获得有利的结果。
GNDA 连接到 GND、VDDA 连接到 VDD
此致、
Mayra
您好!
我有两点看法。
[报价 userid="475151" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1401461/tm4c1294ncpdt-voltage-reading-via-adc-pins/5381541 #538154"]用万用表测量的输入电压 | 记录在 Code Composer 中 |
18毫伏 | 不确定 |
20mV | 不确定 |
30.1mv | 不确定 |
40.3mv | 不确定 |
50.6mv | 不确定 |
60.5毫伏 | 不确定 |
70.05mv | 不确定 |
80.05mv | 不确定 |
90.06mv | 不确定 |
您是否能够显示实际的12位 ADC 转换值、而不是转换回电压后的值、而不是说明 indefineido。
GNDA 连接到 GND、VDDA 连接到 VDD
[报价]这就是我之前提到过的、通过将 GNDA 与 GND 分离、并将 VDDA 与 VDD 分离、准确度将更高、因为数字噪声不会耦合到模拟电源中。 但是、您目前将它们连在一起。
[/quote]我无法在另一张卡上测试微控制器、
[报价]我之前问过您是使用另一个板、还是使用其他 MCU 来替换现有卡上的板、但您表示这是不可能的。 您说您只有一个芯片吗?
您好!
这些图像对应于实际12位 ADC 的3个屏幕截图
值为18mV 时的转换值。
值会随着时间的推移而变化、因此我只取了3个值作为样本。



这些图像对应于值为30mV 的实际12位 ADC 转换值的3个屏幕截图。
值会随着时间的推移而变化、因此我只取了3个值作为样本。



这些图像对应于实际的12位 ADC 转换值(值为80mV)的3个屏幕截图。
值会随着时间的推移而变化、因此我只取了3个值作为样本。



是的,我只有一个芯片,我有两个,但我在事故中短接了一个并烧毁它。
但是、即使在 LaunchPad 上进行了测试、前一个芯片也发生了完全相同的情况。
这些值在我看来并不正常。 任何大于3LSB 的值通常都不是数据表中规定的最坏情况。 我真的希望您可以再购买一个芯片进行测试。 转换值49等于0x31时测得的电压为18mV。 18mA 应提供大约0x16的转换值。 这超过了3LSB 的误差。 我往往认为您遇到了一次性问题。 您可以在 LaunchPad 上重复测试吗? 下面是我在 PK2上运行的一个非常简单的代码。 如果 GNDA/VDDA 和 VREF+都与 VDD 和 GND 分开、我认为这些值本来会更好。
ADC ->
类型:单端
AIN18 = 0
AIN18 = 4.
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 1
AIN18 = 2.
AIN18 = 3.
AIN18 = 0
AIN18 = 1
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 1
AIN18 = 0
AIN18 = 3.
AIN18 = 6.
AIN18 = 5.
AIN18 = 1
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 2.
AIN18 = 0
AIN18 = 2.
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 2.
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 6.
AIN18 = 6.
AIN18 = 0
AIN18 = 0
AIN18 = 0
AIN18 = 2.
#include <stdbool.h> #include <stdint.h> #include "inc/hw_memmap.h" #include "driverlib/adc.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" //***************************************************************************** // //! \addtogroup adc_examples_list //! <h1>Single Ended ADC (single_ended)</h1> //! //! This example shows how to setup ADC0 as a single ended input and take a //! single sample on AIN0/PE3. //! //! This example uses the following peripherals and I/O signals. You must //! review these and change as needed for your own board: //! - ADC0 peripheral //! - GPIO Port E peripheral (for AIN0 pin) //! - AIN0 - PE3 //! //! The following UART signals are configured only for displaying console //! messages for this example. These are not required for operation of the //! ADC. //! - UART0 peripheral //! - GPIO Port A peripheral (for UART0 pins) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! This example uses the following interrupt handlers. To use this example //! in your own application you must add these interrupt handlers to your //! vector table. //! - None. // //***************************************************************************** #define USER_LED1 GPIO_PIN_2 #define SEQNUM 3 //***************************************************************************** // // This function sets up UART0 to be used for a console to display information // as the example is running. // //***************************************************************************** void InitConsole(void) { // // Enable GPIO port A which is used for UART0 pins. // TODO: change this to whichever GPIO port you are using. // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // // Configure the pin muxing for UART0 functions on port A0 and A1. // This step is not necessary if your part does not support pin muxing. // TODO: change this to select the port/pin you are using. // GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); // // Enable UART0 so that we can configure the clock. // SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // // Use the internal 16MHz oscillator as the UART clock source. // UARTClockSourceSet(UART0_BASE, UART_CLOCK_SYSTEM); // // Select the alternate (UART) function for these pins. // TODO: change this to select the port/pin you are using. // GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // // Initialize the UART for console I/O. // UARTStdioConfig(0, 115200, 120000000); } //***************************************************************************** // // Configure ADC0 for a single-ended input and a single sample. Once the // sample is ready, an interrupt flag will be set. Using a polling method, // the data will be read then displayed on the console via UART0. // //***************************************************************************** int main(void) { uint32_t ui32SysClock; // // This array is used for storing the data read from the ADC FIFO. // uint32_t pui32ADC0Value[0]; // // Set the clocking to run at 20 MHz (200 MHz / 10) using the PLL. When // using the ADC, you must either use the PLL or supply a 16 MHz clock // source. // TODO: The SYSCTL_XTAL_ value must be changed to match the value of the // crystal on your board. // ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 120000000); // // Set up the serial console to use for displaying messages. This is // just for this example program and is not needed for ADC operation. // InitConsole(); // // Display the setup on the console. // UARTprintf("ADC ->\n"); UARTprintf(" Type: Single Ended\n"); // // The ADC0 peripheral must be enabled for use. // SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK); /* * ADC Clock runs at 30Mhz */ // ADCClockConfigSet(ADC0_BASE, ADC_CLOCK_SRC_PLL, 10); /* PE3 - AIN0 */ GPIOPinTypeADC(GPIO_PORTK_BASE, GPIO_PIN_2 ); ADCSequenceConfigure(ADC0_BASE, SEQNUM, ADC_TRIGGER_PROCESSOR, 0); ADCSequenceStepConfigure(ADC0_BASE, SEQNUM, 0, ADC_CTL_CH18 | ADC_CTL_IE | ADC_CTL_END); ADCSequenceEnable(ADC0_BASE, SEQNUM); ADCIntClear(ADC0_BASE, SEQNUM); while(1) { // // Trigger the ADC conversion. // ADCProcessorTrigger(ADC0_BASE, SEQNUM); // // Wait for conversion to be completed. // while(!ADCIntStatus(ADC0_BASE, SEQNUM, false)) { } // // Clear the ADC interrupt flag. // ADCIntClear(ADC0_BASE, SEQNUM); // // Read ADC Value. // ADCSequenceDataGet(ADC0_BASE, SEQNUM, pui32ADC0Value); // // Display the AIN0 (PE3) digital value on the console. // UARTprintf("AIN18 = %4d\n", pui32ADC0Value[0]); // // This function provides a means of generating a constant length // delay. The function delay (in cycles) = 3 * parameter. Delay // 250ms arbitrarily. // SysCtlDelay(ui32SysClock / 100); } }
您好!
我尝试了你刚刚给我看的代码、但是它不起作用。 至于尝试使用另一个微控制器、我以前也曾在 Launchpad、相同型号的微控制器上进行过尝试、
是我不小心烧毁的那个、即使在 LaunchPad 上、微控制器也没有读取如此小的电压、起初我认为微控制器已经读取了
很习惯,所以我买了一个新的。 这是我在我的 PCB 设计中组装的那个。
所以有两个微控制器,我测试,并发生同样的事情:(
此致、
Mayra
您好!
很抱歉,因为昨天是美国公共假日。
我尝试了您刚才向我展示的代码、但它不起作用。
我知道我的代码没有帮助、因为我认为您遇到了一次性问题。 我在 LaunchPad 上运行该代码、并且能够获得不错的结果、并且在大多数情况下、与您的测量结果相比、测量结果要好得多。
即使在 Launchpad 上、微控制器也无法读取如此小的电压
您能否在 Launchpad 上尝试我的代码并报告测量结果?
目前、我很难解释为何您在低输入电压下的测量值与预期值相差甚远。 这就是为什么我想在你拥有的所有器件上看到可重复性。 我知道您说过您已经尝试了另一个 MCU 已烧坏。 您是否有可能获取更多的信息?
您好!
很抱歉耽误了时间、我一直在执行其他任务。
我无法使用另一个进行实验
或与另一个微控制器配合使用、因为我没有其他微控制器。
在前一个微控制器烧毁之前、我能够进行测试
使用我的 ADC 读取小电压、但没有令人满意的结果:(
此致
Mayra
尊敬的 Mayra:
遗憾的是、我的想法太多了、无法为您提供帮助。 首先、我无法在我的 LaunchPad 上重现您的结果、而且您无法通过其他方式获取另一个 LaunchPad 或 MCU、这使得问题难以解决。
您好!
我知道由于缺少其他方法来检查数据、这种方法非常复杂
另一个微控制器或另一个 LaunchPad。 您是否也使用 TM4C1294XL 开发板? 它是最新的模型吗?
此致、
Mayra
您好!
很抱歉,因为我不在办公室,刚回来。 我使用的是多年前制造的 EK-TM4C1294XL 板。 我在工作台上使用它已经很多年了。