如何让我的ADC在tm4c123gxl微控制器上工作?

时间:2017-05-17 18:59:26

标签: arm keil cortex-m microprocessors

我的步骤如下: 启用ADC的时钟和AIN10(PB4)的端口。 禁用与引脚B4对应的DEN和DIR寄存器中的相应位。 使能AFSEL寄存器和PCTL寄存器*中的相应引脚。 将寄存器设置为:采样率,优先级(SS3)等,如代码所示。

然后我在另一个函数中触发它但不知何故我的ADC没有读取任何其他的施加电压值。

我的第一个问题是关于PCTL以及我们在其上启用ADC需要什么价值?

我一直试图解决它一天,但我还没有想出来。非常感谢任何帮助。

   //  Register definitions for clock enable
#define SYSCTL_RCGCGPIO_R ( * ( ( volatile unsigned long *) 0x400FE608 ) )
#define SYSCTL_RCGCADC_R ( * ( ( volatile unsigned long *) 0x400FE638 ) )
#define GPIO_PORTB_AFSEL_R ( * ( ( volatile unsigned long *) 0x40058420 ) )
#define GPIO_PORTB_PCTL_R (*(( volatile unsigned long *)0x4005952C))


// Register definitions for GPIO port B        ;;;;;         AIN10 = PB4
#define GPIO_PORTB_DATA_R ( * ( ( volatile unsigned long *) 0x400053FC) )
#define GPIO_PORTB_DIR_R ( * ( ( volatile unsigned long *) 0x40005400 ) )
#define GPIO_PORTB_DEN_R (  *( ( volatile unsigned long *) 0x4000551C) )


//  Register definitions for ADC0 and Sample Sequencer 3
#define ADC0_PC_R ( * ( ( volatile unsigned long *) 0x40038FC4 ) )
#define ADC0_SSPRI_R ( * ( ( volatile unsigned long *) 0x40038020 ) )
#define ADC0_ACTSS_R ( * ( ( volatile unsigned long *) 0x40038000 ) )
#define ADC0_IM_R ( * ( ( volatile unsigned long *) 0x40038008 ) )
#define ADC0_RIS_R ( * ( ( volatile unsigned long *) 0x40038004 ) )
#define ADC0_ISC_R ( * ( ( volatile unsigned long *) 0x4003800C) )
#define ADC0_SAC_R ( * ( ( volatile unsigned long *) 0x40038030 ) )
#define ADC0_PSSI_R ( * ( ( volatile unsigned long *) 0x40038028 ) )
#define ADC0_SSCTL3_R ( * ( ( volatile unsigned long *) 0x400380A4 ) )
#define ADC0_SSFIFO3_R ( * ( ( volatile unsigned long *) 0x400380A8 ) )

unsigned char Lookup_7Seg_Disp [ 12 ] = {0xC0 , 0xF9 , 0xA4 , 0xB0 , 0x99 ,
    0x92 , 0x82 , 0xF8 , 0x80 , 0x90 , 0xC6};
unsigned char Temperature_Value [ 3 ] = {0 , 0 , 0xA} ;
unsigned char i , value=0;
unsigned int ADC_value = 0 , voltage = 0 ;
int maxVoltage=0;


void ADC_Init() {
    volatile unsigned long delay;
    SYSCTL_RCGCGPIO_R |= 0x01;   //Enable Clock for Port A
    SYSCTL_RCGCADC_R |= 0x1;     //Enable ADC0


    delay = SYSCTL_RCGCGPIO_R;   //Delay for clock to settle down

    GPIO_PORTB_DIR_R &= ~(0x10);//PB4 as input
    GPIO_PORTB_DEN_R &= ~(0x10);//PB4 as analog type
    GPIO_PORTB_AFSEL_R |= 0x10;
    GPIO_PORTB_PCTL_R |= 0x10;


    //Clear sampling rate
    ADC0_PC_R &= 0x00;
    //Set sampling rate to 125ksps
    ADC0_PC_R &= 0x01;
    //Set priority to SSFI3
    ADC0_SSPRI_R |= 0x3210;
    //Disable sample sequence 3 befor configuration
    ADC0_ACTSS_R &= ~0x8;
    //Enable TS0, IE0 and END0 bits
    ADC0_SSCTL3_R |= 0xE;
    //Enable 16x hardware oversampling
    ADC0_SAC_R |= 0x4;
    //Disable Interrupt by writing 0 to corresponding bit
    ADC0_IM_R &= ~(0x8);
    //Activate sample sequencer 
    ADC0_ACTSS_R |= 0x8;
}

void SystemInit() {

}

void ADC_Voltage(void) {
    ADC0_PSSI_R |= 0x8;
    while ((ADC0_RIS_R & 0x8)==0);
    ADC_value = (ADC0_SSFIFO3_R & 0xFFF);
    voltage = (ADC_value)*44;
    if(voltage>maxVoltage){
        maxVoltage=voltage;
    }
    ADC0_ISC_R |= 0x08;
}

void delay(unsigned long counter) {
    int i;
    for(i=0;i<counter;i++)
    {}
}

int main(void) {
    ADC_Init();
    delay(1000);
    ADC_Voltage();
    maxVoltage=maxVoltage*0.707;

}

1 个答案:

答案 0 :(得分:0)

我不确定你是否解决了这个问题。我通常使用TI提供的驱动程序库,你可以在TivaWARE中找到它,所以我不知道所有寄存器是否能让我无法完成这个DRM。仔细检查您是否正确地复用了引脚。另一件要看的是样本序列器。 ADC位于采样序列发生器上,您还必须设置它们,样本数量,样本源等。您可以通过设置序列发生器来读取内部温度传感器而不是内部温度传感器来测试ADC配置。一个外部引脚,至少可以调试代码的那一部分。如果可行,然后将其切换到外部引脚并且它不再起作用,那么您将知道问题是引脚复用。

您是否有令人信服的理由不使用TI提供的驱动程序库?使用它而不是执行DRM需要花费几分钟来设置。如果代码大小是一个问题,tm4c在ROM上也有驱动程序库

即使您出于某种原因无法使用driverlib,请查看driverlib源代码,tivaware外设驱动程序库用户指南和示例代码。您将看到设置它所需的driverlib调用,并可以将其追溯到需要配置的寄存器。