void pot_init(void) { //sets up interrupts to trigger on every sucessful conversion IRQ_ConfigureIT(AT91C_ID_ADC, 0, ISR_ADC); //initilize ADC ADC_Initialize(AT91C_BASE_ADC, AT91C_ID_ADC, AT91C_ADC_TRGEN_DIS, 0, AT91C_ADC_SLEEP_NORMAL_MODE, AT91C_ADC_LOWRES_10_BIT, BOARD_MCK, BOARD_ADC_FREQ, 10, 1200); ADC_EnableDataReadyIt(AT91C_BASE_ADC); ADC_EnableChannel(AT91C_BASE_ADC, POT_CHANNEL); IRQ_EnableIT(AT91C_ID_ADC); ADC_EnableIt(AT91C_BASE_ADC, POT_CHANNEL); //Starts the adc ADC_StartConversion(AT91C_BASE_ADC); }
void SensorsInit() { char pinDirection = 0; int i; PIO_Configure(analogs, PIO_LISTSIZE(analogs)); PIO_Configure(digitalIns, PIO_LISTSIZE(digitalIns)); PIO_Configure(sensorsPower, PIO_LISTSIZE(sensorsPower)); PMC_EnablePeripheral(AT91C_ID_PIOB); PMC_EnablePeripheral(AT91C_ID_PIOA); PMC_EnablePeripheral(AT91C_ID_ADC1); ADC_Initialize(AT91C_BASE_ADC1, AT91C_ID_ADC1, AT91C_ADC_TRGEN_DIS, \ 0, AT91C_ADC_SLEEP_NORMAL_MODE, AT91C_ADC_LOWRES_10_BIT, \ MCK, BOARD_ADC_FREQ, 10, 3000); for(i = 0;i < 8;i++) ADC_EnableChannel(AT91C_BASE_ADC1, i); SetPitCallback(SensorsCallback,1); SelectAng0(); // select analog port 0 to be mesured instead of BattVoltage SensorPowerOn(); // turn on the Vcc line if(PMC_IsPeriphEnabled(AT91C_ID_TWI) == 0){ PIO_Configure(twiPortPins, PIO_LISTSIZE(twiPortPins)); PMC_EnablePeripheral(AT91C_ID_TWI); TWI_ConfigureMaster(AT91C_BASE_TWI,TWCK,MCK); } // set all pins on pullup chip to output WritePullupData(0x00,&pinDirection,1); WritePullupData(0x01,&pinDirection,1); for(i = 0;i < 8;i++){ if(i>1) AnalogPullup(i,1); // enable pullups if needed DigitalPullup(i,1); // enable all digital pullups } }
/*---------------------------------------------------------------------------*/ void Potentiometer_Init(void) { ADC_Start(); ADC_EnableChannel(POTENTIOMETER_CHANNEL); }
static uint32_t _WFE_Potentiometer_Initialize( void ) { Adc *pAdc = ADC; int32_t dwLowPotThreshold, dwHighPotThreshold; /* STEP1: Realize a first measure to get potentiometer's initial position */ /* Initialize ADC*/ ADC_Initialize( pAdc,ID_ADC, ADC_MR_TRGEN_DIS,/*HARDWARE trigger*/ 0,ADC_MR_SLEEP_NORMAL,ADC_MR_LOWRES_12_BIT, BOARD_MCK,BOARD_ADC_FREQ,10,20); /*Enable channel 5 (potentiometer) */ ADC_EnableChannel(pAdc, ADC_CHANNEL_5); /* Start convrsion */ ADC_StartConversion(pAdc); /* Wait for the end of conversion */ while ( !(ADC_GetStatus(pAdc) & ADC_ISR_EOC5) ) {} /* Get the potentiometer initial value */ gdwPotentiometerValue = ADC_GetConvertedData(pAdc, ADC_CHANNEL_5); /* Set Window threshold according to the initial values */ dwLowPotThreshold = gdwPotentiometerValue - (NB_INTERVALS * (0x1000 / 256)); if (dwLowPotThreshold < 0) dwLowPotThreshold = 0; dwHighPotThreshold = gdwPotentiometerValue + (NB_INTERVALS * (0x1000 / 256)); if (dwHighPotThreshold >= 0x1000) dwHighPotThreshold = 0x1000 - 1; /* Normalize the value 0 -> 255 */ gdwPotentiometerValue = (gdwPotentiometerValue * 256) / 0xFFF; /* STEP2: Re configure ADC to use windowing */ /* Initialize ADC*/ ADC_Initialize( pAdc,ID_ADC, ADC_MR_TRGEN_EN,/*HARDWARE trigger*/ ADC_MR_TRGSEL_ADC_TRIG0,ADC_MR_SLEEP_NORMAL,ADC_MR_LOWRES_12_BIT, BOARD_MCK,BOARD_ADC_FREQ,10,20); /*Enable channel 5 (potentiometer) */ ADC_EnableChannel(pAdc, ADC_CHANNEL_5); /* Configure TC*/ ConfigureTc0(); /*Channel 5 has to be compared*/ ADC_SetCompareChannel(pAdc, ADC_CHANNEL_5); /*Compare mode, in the window*/ ADC_SetCompareMode(pAdc, ADC_EMR_CMPMODE_OUT); /* Setup Threshold*/ ADC_SetComparisonWindow(pAdc,((dwHighPotThreshold<<16)|dwLowPotThreshold)); /* enable adc interrupt*/ NVIC_EnableIRQ(ADC_IRQn); /* Enable Compare Interrupt*/ ADC_EnableIt(pAdc, ADC_IDR_COMPE); /* Start TC0 and hardware trigger*/ TC_Start(TC0,0); return SAMGUI_E_OK ; }