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/EK-TM4C123GXL:EK-TM4C123GXL 上的 ADC 转换问题

Guru**** 2618835 points

Other Parts Discussed in Thread: EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/787754/ccs-ek-tm4c123gxl-adc-conversion-issue-on-the-ek-tm4c123gxl

器件型号:EK-TM4C123GXL

工具/软件:Code Composer Studio

int main (void)
{
//将时钟设置为16MHz
SysClockSet (SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_MAIN | SYSCTL_XTAL_16MHz);

//启用 GPIOE、D 和 B 外设 SysCtlPeripheralCtl(

SysCtl_Periptl

)

;启用 GPIO0_GPIO0_GPIO0_PeripheralCtl_GPIO0_GPIO0_GPIO_。
//
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

//等待 GPIOE、B 和 D 模块准备就绪。

while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE)
){
}
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOD)
){
}
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB))
){
}
//等待 ADC0模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)
){
}

//配置 ADC 函数
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSORE、0);
ADCSequenceStepConfigure (ADC0_BASE、3、ADCCTL_BASE);ADCClockSet_ADC0
(ADCK_BASE_0);ADCCC0
(ADCK_BASE_ADCK_SIBLE_ADCK_0
) ADC_CLOCK _SRC_PLL| ADC_CLOCK _RATE_FULL、24);

/* void configADC (){//将 PE#配置为模拟输入
SYSCTL_RCGCADC_R |= 1;//打开 ADC0时钟
GPIO_Porte _AFSEL_R |= 0x01;//设置 ADC 输入引脚
GPIO_SEND_ADC0 ~
= 0xSS_ADC0;= ADC0 = ADC_SEND_ADCST_ADC0;= 0xSS_ADC0 = ADC0 = ADCK_ENDC_TR_ADC0;= ADC0 = ADC_ENDC_ADC0 = ADC0 = ADCK_ENDC_ENDC_ADC_ENDC_TR_ADC0;= ADC0 = ADC_ENDC_ADC0 = 0xSS_AD_AD_ENDC_ENDC_TR_ADC0;= AD_ADC0 = AD_ENDC_ENDC_ENDC_AD_AD_EN

~



ADC0_ACTSS_R |= ADC_ACTSS_ASEN3;

}//



配置 ADC 引脚 PE1和 PE2以实现正确操作 PG 267
//PE1为速度,PE2为操作杆

GPIOPorte PinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);

//设置输出引脚
// GPIOP_PIN_OUTPUT_0| GPIO_OUTPIN_IN_PIN_0_GPIO_OUTPSIMP_PIN_OUTPSI_IN_0| GPIO_OUTPIN_IN_PIN_PIN_OUTPSI_0_IN_PIN_IN_PIN_IN_PIN_OUTPSIMP_0|GPIO_PIN_GPIO_OUTP_PIN_PIN_PIN_PIN_PIN_PIN_OUTP_0_PIN_IN_PIN_GPIO_OUTPSI_PIN_PIN_PIN_PIN_



//设置输入引脚
GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_1 | GPIO_PIN_2);

//向引脚
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5)写入特定值;//启用白色/绿色 GPIOPCtlWrite
(GPIO_PORTB_BASE



);
// GPIO0_PHIN

(GPIOB_0);// TOM_PWREN (GPIOB_0);// TOM_PWM0* 0 (PHY_PHY0);// GPIOB_TOM_PWM_BASE (GPIOB_0);// TO/TO/TOM_PWM0* PWM_BASE (GPIOB_0);GPIOB_PWM_BYTE);// TO/TO/TO/TO/TOM_PWM_BY0 (GPIOB_PWM0* 0 (GPIOB_PWM_BY_0) TO/TO_PWM_BY_PWM_BYTE);// TO/GPIOB
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);
SysCtlDelay (延迟);
GPIOPinWrite (GPIO_PORTD_BASE、 GPIO_PIN_0、GPIO_PIN_0);
计数器=计数器+ 1;
}*/
//读取速度电位器输入
while (1)
{

ADCProcessorTrigger (ADC0_BASE,3);
//等待转换完成
,而(!ADCIntStatus (ADC0_BASE,3,false))
}

// ADCProcessorTrigger (ADC0)/ADCdata/ADC0 (base



);ADCdata/ADC0 (read/ADCdata/ADCR2);ADCdata/ADCR2 (base (read/ADCdata/ADCASE);ADCdata/ADC0);ADCdata/ADC0 (READ_datase/ADCle&n)
//读取 speed
speed_volt =((array[0]* 3.3)/4095)的模拟值;//将数字值转换为电压
//x_volt =((array1 * 3.3)/4095);//如果


(0.00<speed_volt<1.00)
、则将数字值转换为电压;//如果从电位计
延迟器获得模拟输入= 2000000 (array0)


、则将数字值转换为电压;while (gpio0);while (delt_deltl (pine_delay);while (gpin_delay);while (gpio0)

GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);
SysCtlDelay (延迟);
GPIOPinWrite (GPIO_PORTD_BASE、 GPIO_PIN_0、GPIO_PIN_0);
计数器=计数器+ 1;
}
}如果(2.00<speed_volt<3.00)
{
delay = 1000000;
// while (counter<25){
//GPIOPORTD_BASE、GPIO_PIN_0、GPIO_PIN_0);
// SysCtlDelay (延迟);
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);
SysCtlDelay (延迟);
GPIOPinWrite (GPIO_PORTD_BASE、 GPIO_PIN_0、GPIO_PIN_0);
SysCtlDelay (延迟);
GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、 0);
//计数器=计数器+ 1;
//}

}
}

上面是我要从 EK-TM4C123GXL launchpad 上的引脚 PE3读取模拟值的代码。 我的最大问题是、当哪个引脚检查输入时、如何进行编程? 此外、当我将电压设置为0至1V 之间时、程序会转到 else 语句、而不是 IF 条件。 我非常感谢您的帮助!  

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

    首先、您会注意到我编辑了您的帖子。 我使用了"插入代码、附加文件等..." 使用<>选项粘贴代码的函数。 这使您的代码可读性更高。 我还进行了一些格式化、以使括号级别更清晰。

    [引用 user="Sadia Ahmed90"]当哪个引脚检查输入时,程序如何检查?

    不确定我是否理解您的问题。 配置 ADC0序列3以对代码第35行中的 ADC 通道0 (PE3)进行采样。 在第88行中、您告诉 ADC 转换器转换为序列3配置的通道。

    [引用 user="Sadia Ahmed90"]当我将电压设置为0至1V 时,程序将转到 else 语句而不是 IF 条件

    您在第103行的"如果"陈述(第115行的其他陈述)不符合您的想法。 您在该语句中有两个比较、"<"。 由于它们是同一个运算符、因此它们按从左到右的顺序进行处理。 比较<的结果是布尔值。 它返回 true 或 false、但实际上返回 true 1、false 0。 如果零小于 SPED_VOLT、则会比较 if 语句所做的操作。 如果为 true、则将答案解释为1。 接下来将比较答案1到1.00。 小于1.00。 由于不是、代码会跳转至"else if"语句。 我认为您真正想要的是:

    如果((0.00 < SPED_VOLT)&&(SPED_VOLT < 1.00))
    

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

    非常感谢您的深入见解! 不过、我修复了该问题、认为程序无法正确读取电位计的模拟读数。 是否缺少一个驱动程序库函数? 通过查看数据表和示例代码、我已经正确配置了所有内容、但我知道它确实没有对输入引脚采样。 当我使用硬件(仅由电位计组成)测试程序时、当我从 MCU 引脚上断开电位计时、我始终得到0.29。我的程序仍然显示速度电压值为0.29。 这意味着电位计的变化对 SPED_VOLT 的值没有影响。 我不知道为什么会这样、任何建议都会有帮助! 提前感谢。    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    检查您的硬件。 我运行了您的代码(进行了我建议的修复)、并看到 SPED_VOLT 中的值与我施加到引脚 PE3的电压相匹配。