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.

[参考译文] TM4C129XNCZAD:设置和读取 ADC 时出现问题

Guru**** 2392445 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/873298/tm4c129xnczad-trouble-setting-up-and-reading-adc

器件型号:TM4C129XNCZAD

您好!

我继承了一个项目、我需要在端口 E 上添加两个新的 ADC 输入、引脚0 (插盒)和引脚2 (门)。   我以为我配置正确、但显然不正确。  我没有看到 ADC 读数发生任何变化、但我已经验证了引脚的电压变化。 代码片段。  感谢您的帮助!

typedef 枚举

 ADC_CHANNEL 0、
 ADC_CHANNEL 温暖_I = ADC_CHANGE_0、   
 ADC_CHANGE_RTD1、
 ADC_CHANNEL、保温器_ID、  
 ADC_CHANNEL MOTOR_I、  
 ADC_CHANNEL SUPPLY_V、
 adc_channel_cartridge、// Bah 新设计
 ADC_CHANNEL、// Bah 新设计
 ADC_CHANNEL 计数、
}adc_channel_t;

#define E温暖_I_channel        (ADC_CTL_CH0)
#define RTD1_CHANNEL             (ADC_CTL_CH17)
#define 保温器_ID_CHANNEL       (ADC_CTL_CH18)
#define MTR_I_CHANNEL            (ADC_CTL_CH2)
#define SUPPLY_CHANNEL           (ADC_CTL_CH19)
#define cartridge 通道       (ADC_CTL_CH3)
#define DOOR 通道            (ADC_CTL_CH1)

void ADC_Initialize (void)

 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);

 /*启用 ADC1外设*/  
 SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
 GPIOPinTypeADC (GPIO_Porte _BASE、
 GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
 GPIOPinTypeADC (GPIO_PORTK_base、
 GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);

 ADCSequenceDisable (ADC1_base、MAIN_SEQUENCE);
 ADCHardwareOversampleConfigure( adc1_base,samples_to 平均);
 ADCReferenceSet( ADC1_base,ADC_REF_INT );
 ADCSequenceConfigure( ADC1_base、MAIN_SEQUENCE、ADC_TRIGGER_PROCESSOR, MAIN_SEQUEST_PRIORITY );

 ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、ADC_CHANNEL、EAR温暖_I_CHANNEL);
 ADCSequenceStepConfigure (ADC1_base、MAIN_SEQUENCE、ADC_CHANNEL RTD1、RTD1_CHANNEL);
 ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、ADC_CHANNEL、EARER_ID_CHANNEL);
 ADCSequenceStepConfigure (ADC1_base、MAIN_SEQUENCE、ADC_CHANNEL MOTOR_I、MTR_I_CHANNEL);
 ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、ADC_CHANNEL、CARGE_CHANNEL);
 ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、ADC_CHANNEL、DOOR 通道);
 ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、ADC_CHANNEL SUPPLY_V、
 SUPPLY_CHANNEL | ADC_CTL_IE | ADC_CTL_END);

 ADCSequenceEnable (ADC1_BASE、MAIN_SEQUENCE);
 ADCIntClear (ADC1_BASE、MAIN_SEQUENCE);

void ADC_StartScan( void )

 /*触发下一个 ADC 转换。 *
 ADCProcessorTrigger (ADC1_base、main_sequence);

void ADC_ReadScan( void )

 int i;
 uint32_t * raw;
 ADCSCALE_t *比例;
 uint32_t rid;
 uint32_t *已转换;
 int32_t temp;

 if (ADCIntStatus (ADC1_base、main_sequence、false))
 {
  /*清除中断标志并读取数据*/  
  ADCIntClear (ADC1_BASE,MAIN_SEQUENCE);
  adcsequenceDataGet ( adc1_base、main_sequence、rawADC );

  RAW = rawADC;

  已转换=已转换的 ADC;
  换算= ADCscale;

  RID = full_scale - rawADC[ADC_CHANGE_wer_ID];
  对于(i = 0;i < sizeray (rawADC);++I)
  {
   //偏移量在移位前被应用以获得额外的精度
   //添加1 <<(SHIFT - 1)将结果舍入。
   temp =* raw * scale-> gain;
   如果(temp >= scale->offset)
   {
    *converted =(temp - scale->offset +(1 <<(scale->shift - 1)))>> scale->shift;
   }
  其他
  {
    *converted = 0;
  }
  ++raw;
  ++转换;
  ++标度;
 }
//用舍入完成加热器的计算。
convertedADC[ADC_CHANGE_保温 器_ID]=
((((convertedADC[ADC_CHANGE_ELO_ID]+ RID)/ RID)+(1 <<(RID_LOG_PRycale - 1)))>> RID_LOG_PRycale;

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

    Brad、您好!

    有点难判断这里发生了什么、但我将尝试一个建议... 可能不是这样:

    ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、ADC_CHANNEL、CARGE_CHANNEL);
    ADCSequenceStepConfigure (ADC1_BASE、 MAIN_SEQUENCE、ADC_CHANNEL、DOOR 通道);
    ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、 ADC_CHANNEL SUPPLY_V、
    SUPPLY_CHANNEL | ADC_CTL_IE | ADC_CTL_END); 

    尝试以下操作:

    ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、ADC_CHANNEL SUPPLY_V、SUPPLY_CHANNEL);
    ADCSequStepConfigure (ADC1_BASE、 MAIN_SEQUENCE、ADC_CHANNEL、CARGE_CHANNEL);
    ADCSequenceStepConfigure (ADC1_BASE、MAIN_SEQUENCE、 ADC_CHANNEL DOOR、
    DOOR 通道| ADC_CTL_IE | ADC_CTL_END); 

    如果这不起作用、您能否检查您是否仍然从以前工作过的其他通道获得 ADC 结果?

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

    您好、Ralph、

    谢谢你。  我已经尝试过您的建议、但在新的 ADC 通道上仍然没有收到任何内容。  其他 ADC 通道按需要工作。  两个新通道是来自光学传感器的输入。

    此致、

    Brad Haber

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

    [引用 user="Brad Haber"] //启用 ADC1外设*/  
     SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
     GPIOPinTypeADC (GPIO_Porte _BASE、
     GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
     GPIOPinTypeADC (GPIO_PORTK_base、
     GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);[/引用]

    也许尝试单独的输入引脚类型、而不是一起或全部一起使用。   

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

    Brad、您好!

    好的、您能否提供其他设置的#define 的详细信息?

    MAIN_SEQUENCE

    Samples_to 均值  

    MAIN_SEQUEST_PRIORITY  

    因此、我想我也可以尝试在我的末端进行一些测试。

    您还提到了验证引脚的电压是否发生变化、您在 MCU GPIO 上看到的电压范围是多少?

    为了进行完整性检查、您能否确保这些 GPIO 不能在程序的任何其他部分未配置? 我强烈怀疑这种情况当然会发生、但验证是否没有代码将所有未使用的 GPIO 设置为需要更新的另一状态不会有任何影响。

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

    您好!

    下面是一条"快速/脏"建议、它应该证明非常有用:"只需将已知良好的通道输入信号之一路由到其中一个(已添加)通道-这些通道发生故障。"    (这可确保您的输入信号"正确"-目前、"需要进行一些讨论"。)

    正如您"继承"此项目一样-您(真的)是否确认添加的通道出现在:"官方、具有 ADC 功能的引脚?"    (只有那些被标记为具有 ADC 功能的引脚-才可担任该角色...)

    除非 ADC 引脚要求进行"监听处理"-正常/习惯情况是、"GPIOPinType ()"适应多个引脚的 OR'ing。   (就像您所做的一样!)   更重要的是、"您以前的所有渠道编码-采用 OR'ing -成功!"   (不知怎么说-这是被遗漏的!)   而是"GPIOPinConfigure()"、它要求"单个条目"。

    与往常一样-如果您尚未这样做-测试模拟信号是否存在、"在实际 MCU 的引脚上!"    (前提是可以这样做- BGA 器件、"尝试自己的灵魂"。)    继承的项目经常可能包含(很少或未记录) PCB 更新/布线-可能是"新通道"上存在"不需要的外部连接"。   仔细探测-电路板处于"带电"状态时-将确认所需模拟信号的安全/空载到达...   (或存在竞争(非法)负载或信号...)

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

    您好!

    谢谢、但这没有什么影响。

    此致、

    Brad

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

    您好、Ralph、

    #define MAIN_SEQUENCE (0)
    #define MAIN_SEQUEST_PRIORITY (0)//最高

    #define SAFESS_TO_AVERAGE 64

    电压范围为0.2mV 至1V

    我将查看您关于更改未使用引脚代码的建议。

    谢谢、感谢您的帮助!

    此致、

    Brad

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

    您好,

    然而 Tivaware 并未声明 PinTypeADC() CAN 或多个引脚。 此外、PinMux 工具输出会向任何模拟引脚类型语句生成单个 GPIO 引脚。 通常、Tivaware 文本将说明何时允许或多个引脚。

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

    您好、GL、

    任何 GPIOPinType__ API 都可以与多个引脚一起使用。 这不会导致此问题。 此外、只添加了两个引脚、这意味着之前每个引脚都有3个的 API 运行良好。

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

    您好(2)、

    我们不知道您是否看过员工/我之前的建议。    (今天早些时候、CST 10:55开/关)

    您会注意到、这两个新通道都来自"光学传感器"。   某些光学传感器具有(非常高的阻抗-即来自光电探测器的传感器)、因此可能"严重"匹配 ADC (建议)低得多的输入阻抗。

    按照我们先前的建议、"将已知良好的输入信号之一替换为您的(故障)光学信号"-您应该能够识别和识别"输入故障与 ADC (引脚或代码)问题"。    

    遵循"保证方法"以减少 ADC 技术挑战中的"未知数量":

    • 断开外部连接与"安全工作" ADC 通道之一的连接-将该连接路由到您的(新)"故障通道?"之一   众所周知、外部信号转换得很好-它将"未知"移离"故障/有缺陷的信号输入"。   如果结果不正确(或没有)读数(现在)、则怀疑特定的 ADC 通道和/或该通道的 ADC 代码存在问题。
    • 断开与 ADC (连接到其中一个"新"引脚)的一个新(光学)连接、而是将该信号路由到(早期、正常工作) ADC 通道。   (从中您刚刚删除并重新路由其早期(经证实)输入信号。   通过这种方式-您将向其中一个"已知正常" ADC 引脚呈现一个"选择"(尚未确认良好)输入信号。   再次-如果 读数不正确(或不正确)、则"新"输入信号为"高度可疑!"

    进一步思考-通过打破(两者)现有的"新"(光学连接)并将其呈现到之前的任何两个"工作 ADC 通道"(在首次移除现有的"已知良好信号"后)、您将"寻找"与"新/光学信号源的正确性"隔离。   如果任一通道'未正确转换'-由于未产生超越'信号源'的变化-则是'信号源'(和/或其对 ADC 的呈现)存在缺陷!    不需要软件更改-哪种方法可以"轻松、简化和增强"这种(首选)方法!    

    与大多数"故障排除"一样-减少"在运行中未知"的数量可改善和加快诊断和校正。

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

    Brad、您好!

    只是想在这里再次提出 CB1的建议、期待听到您尝试他的方法的测试结果。 我还没有机会运行 ADC 代码、我不确定能否在周一运行、但我认为 CB1已经出现了一些问题、因为我真的看不到您的代码设置有什么问题。

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

    感谢 Ralph -我的团队建议的系统方法是"经典"- 减少"未知"的数量并且(近乎)容易实施。   (即启用未更改的海报软件-通过使用那些海报已报告"工作正常"的 ADC 渠道。   这种残酷的"聚焦/暴露"海报对这些"新型光学传感器"的介绍- 并且将清楚地表明、"接受或拒绝"它们的实施!)

    所有(其他)建议都得到了认可、但这些"最有条理、详细和合理"的建议却在(奇怪的)沉默中被证实...   (证明这超出了我年轻/天赋团队的控制范围...)

    应该在某个时候发布海报、选择"采用我的团队指南"- 很可能"在光学传感器的输出和 ADC 的输入之间拼版运算放大器"(更好地"匹配"ADC 的输入要求)会成功...   (即更加稳定/安全(和空载)的传感器输出、只有这样才能实现正确的 ADC 测量。)

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

    尊敬的 CB 和 Ralph:

    不想沉默!  EE 正在设置您建议的测试、希望他将在周一准备就绪。  使用的引脚确实使用 ADC 作为其备用功能。  

    此致、

    Brad Haber

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

    更新了。  我周末有一个单元在家里、从星期六早上开始、该单元持续通电。  周日晚上6:30左右、传感器读数开始工作。  对 ADC 代码未做任何更改。  冷焊点?

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

    您好!

    我所在的集团不会向客户提供此类调查结果-这并不是决定性的。    此外-您曾提到"两个失效通道"(两个新通道)-因此您是否建议两个失效的焊点?    

    我们坚持有条理的疑难解答方法-相当清楚地说明了这一点。    

    本报告没有说明注意到"开始工作"的工作条件。   (以及您是否/如何实施了(任何)先前列出的系统建议?)   

    请注意、"开始工作"(以某种方式)并不是特别详细和/或鼓舞人心的。    (只有您知道"工作"的参数-因为这些参数从未被披露...)

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

    您好!

    我很高兴发布新的发展。  

    我的意思是 ADC 引脚的传感器输入不再是静态的、软件会显示正确的屏幕、并根据传感器读数发出警报。   

    但是、该器件再次按预期停止工作。  我们的新发现是堆栈容差已关闭、这将触摸屏推向其外壳。   松开触摸屏连接螺钉后、设备再次出现问题。  

    我尚未完全理解、但根据传感器输入、设备工作、屏幕变化和警报音似乎更有可能是昨晚的移动导致触摸屏暂时无法按压到紧靠外壳的动作。

    我再次给出了您建议的步骤。   

    第二个新通道尚未工作、但我们的 EE 和我相信这是由于传感器的位置所致。

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

    谢谢您-这非常需要新数据。

    您的是"4线模拟电阻式触摸屏"-"不需要的周边接触"是"已知的困难原因"。    也就是说、对"两个触摸屏模拟输入、如"光学传感器"的描述证明是不可能的!   (除非所述触摸屏是20世纪80年代的'IR'(红外)版本!)    准确高效的诊断需求(正确)描述性数据...   (触摸屏更有可能是:模拟电阻或电容(即支持多点触摸)。

    有专门的"触摸屏控制 IC"-可加快、简化并增强与此类屏幕的连接。   还可以使用 MCU 来驱动并解析此类屏幕的触摸输入。   (这是为了遵循您的、"纠正由于安装不全导致的触摸屏非法激活"。)  

    对于"4线制、电阻式"、有两个正交触摸平面。   这些平面必须(两个)主动(按顺序)驱动、然后"重新读取"-这需要(部分) MCU 操作的方向和协调。   您现在似乎已经成功  (或接近)- MCU 的 ADC 是"无"的-" MCU 的新 ADC 通道 的完整性"(如预测的那样)被证明是可疑的。

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

    感谢 CB1_MOBILE 和 Ralph!  鸟儿在唱歌,阳光灿烂!  我学会更好地描述我正在处理的问题。