Подключение АЦП в 1986ВЕ91Т Миландр (внешний сигнал)
Отладочная плата с микроконтроллером 1986ВЕ91Т. Среда программирования - Keil. Появилась задача оцифровки внешнего напряжения, поступающего на ножку микроконтроллера, но АЦП показывает все время своё некорректное значение, возможно, что проблема в опорном напряжении, но у меня пока не получается верно настроить, чтобы правильно считывать, что не так в коде или в настройке? Также, когда отключаю внешнее напряжение, то он показывает то же значение.
Канал АЦП - 4, порт настроен на вход.
Листинг когда:
#include "math.h"
#include "MDR32FxQI_port.h"
#include "MDR32FxQI_rst_clk.h"
#include "MDR32FxQI_uart.h"
#include "MDR32FxQI_adc.h"
#define delay(T) for(i = T; i > 0; i--)
static int i;
static ADC_InitTypeDef ADC;
static ADCx_InitTypeDef ADC1;
static PORT_InitTypeDef PORTINIT;
void ADC_IRQHandler(void);
void ADCINIT(void);
void PORTADC(void);
void ADC_IRQHandler(void)
{
uint32_t RESULTS;
if(ADC_GetITStatus(ADC1_IT_END_OF_CONVERSION))
{
RESULTS = ADC1_GetResult();
RESULTS &= 0x00FFF;
NVIC_ClearPendingIRQ(ADC_IRQn);
}
}
void PORTADC()
{
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTD, ENABLE);
PORTINIT.PORT_Pin = PORT_Pin_4;
PORTINIT.PORT_OE = PORT_OE_IN ;
PORTINIT.PORT_PULL_UP = PORT_PULL_UP_OFF;
PORTINIT.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
PORTINIT.PORT_PD_SHM = PORT_PD_SHM_OFF;
PORTINIT.PORT_GFEN = PORT_GFEN_OFF;
PORTINIT.PORT_SPEED = PORT_SPEED_MAXFAST;
PORTINIT.PORT_MODE = PORT_MODE_ANALOG;
PORTINIT.PORT_FUNC = PORT_FUNC_MAIN;
PORT_Init(MDR_PORTD, &PORTINIT);
}
void ADCINIT()
{
PORTADC();
RST_CLK_PCLKcmd(RST_CLK_PCLK_RST_CLK | RST_CLK_PCLK_ADC, ENABLE);
RST_CLK_ADCclkSelection(RST_CLK_ADCclkCPU_C2);
RST_CLK_ADCclkPrescaler(RST_CLK_ADCclkDIV128);
RST_CLK_ADCclkEnable(ENABLE);
ADC_DeInit();
ADC_StructInit(&ADC);
ADCx_StructInit(&ADC1);
ADC.ADC_SynchronousMode = ADC_SyncMode_Independent;
ADC.ADC_StartDelay = 0;
ADC.ADC_TempSensor = ADC_TEMP_SENSOR_Disable;
ADC.ADC_TempSensorAmplifier = ADC_TEMP_SENSOR_AMPLIFIER_Disable;
ADC.ADC_TempSensorConversion = ADC_TEMP_SENSOR_CONVERSION_Disable;
ADC.ADC_IntVRefConversion = ADC_VREF_CONVERSION_Disable;
ADC.ADC_IntVRefTrimming = 1;
ADC_Init(&ADC);
ADC1.ADC_ClockSource = ADC_CLOCK_SOURCE_ADC;
ADC1.ADC_SamplingMode = ADC_SAMPLING_MODE_CYCLIC_CONV;
ADC1.ADC_ChannelSwitching = ADC_CH_SWITCHING_Disable;
ADC1.ADC_ChannelNumber = ADC_CH_ADC4;
ADC1.ADC_LevelControl = ADC_LEVEL_CONTROL_Disable;
ADC1.ADC_VRefSource = ADC_VREF_SOURCE_INTERNAL;
ADC1.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_INEXACT ;
ADC1.ADC_Prescaler = ADC_CLK_div_256;
ADC1.ADC_DelayGo = 0x05;
ADC1_Init(&ADC1);
NVIC_EnableIRQ(ADC_IRQn);
NVIC_SetPriority(ADC_IRQn, 0);
ADC1_ITConfig(ADC1_IT_END_OF_CONVERSION, ENABLE);
ADC1_Cmd(ENABLE);
}
int main(void)
{
ADCINIT();
while(1)
{
delay(0xFFFF);
ADC1_Start();
}
}
