Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-ноя-13 04:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Проблемма в преобразовании АЦП.
СообщениеДобавлено: 2014-ноя-26 15:56 
Не в сети

Зарегистрирован: 2014-ноя-10 15:38
Сообщения: 10
Подаю с генератора 1000 мВ , а МК показывает 1226.
ген.=200мВ МК=239
ген.=2000мВ МК=2466
Подскажите что я делаю не так.
Код:
MDR_RST_CLK->PER_CLOCK |= (1 << 17);                                            //тактирование PortD
MDR_RST_CLK->ADC_MCO_CLOCK = 0x00002A20;                                       //настройка ADC

MDR_PORTD->ANALOG = 0x0000;
   
MDR_ADC->ADC1_CFG |= 0xFEC21051;
MDR_ADC->ADC1_STATUS = 0;
while(1)
   {
      MDR_ADC->ADC1_CFG |= (1<<1);                           //start of ADC
      while((MDR_ADC->ADC1_STATUS&(1<<2))!=(1<<2));   //ждем преобразование
      a=(uint16_t)MDR_ADC->ADC1_RESULT&0xFFFF;

   }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-26 16:30 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1285
Откуда: АО "ПКК Миландр"
rayman777 писал(а):
Подаю с генератора 1000 мВ , а МК показывает 1226.
ген.=200мВ МК=239
ген.=2000мВ МК=2466
Подскажите что я делаю не так.
Код:
MDR_RST_CLK->PER_CLOCK |= (1 << 17);                                            //тактирование PortD
MDR_RST_CLK->ADC_MCO_CLOCK = 0x00002A20;                                       //настройка ADC

MDR_PORTD->ANALOG = 0x0000;
   
MDR_ADC->ADC1_CFG |= 0xFEC21051;
MDR_ADC->ADC1_STATUS = 0;
while(1)
   {
      MDR_ADC->ADC1_CFG |= (1<<1);                           //start of ADC
      while((MDR_ADC->ADC1_STATUS&(1<<2))!=(1<<2));   //ждем преобразование
      a=(uint16_t)MDR_ADC->ADC1_RESULT&0xFFFF;

   }


Сложно судить, мало данных.
Снимите всю шкалу для наглядности.
Так же снимите показания АЦП когда вход подключен на землю платы и на питание платы.

А так вроде как большое смещение внизу, возможно проблемы с землями между генератором и платой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-окт-12 17:30 
Не в сети

Зарегистрирован: 2013-мар-13 14:30
Сообщения: 8
Откуда: Зеленоград
Вот этот код для настройки ADC заработал.

Код:
#ifndef __ADC_H
#define __ADC_H

#include <MDR32F9Qx_port.h>
#include <MDR32F9Qx_adc.h>

#define ADC_CHANNEL_MASK (0x001F0000)

#define PORTD_ADC_VBAT_CLK RST_CLK_PCLK_PORTD
#define ADC_VBAT_PORTD MDR_PORTD
#define ADC_VBAT_PIN5 PORT_Pin_5

#define PORTD_ADC_AC_CLK RST_CLK_PCLK_PORTD
#define ADC_AC_PORTD MDR_PORTD
#define ADC_AC_PIN3 PORT_Pin_3

#define PORTD_IBAT_FILT_CLK RST_CLK_PCLK_PORTD
#define IBAT_FILT_PORTD MDR_PORTD
#define IBAT_FILT_PIN9 PORT_Pin_9

#define PORTD_IAC_FILT_CLK RST_CLK_PCLK_PORTD
#define IAC_FILT_PORTD MDR_PORTD
#define IAC_FILT_PIN6 PORT_Pin_6

enum AdcID { ADC_ID_1 = 0, ADC_ID_2 = 1, AMOUNT_OF_ADC = 2 };

void init_adc(void);
uint32_t read_adc_channel(enum AdcID adcItem, uint32_t desChannel);

#endif /* __ADC_H */


Код:
#include "adc.h"
#include <MDR32F9Qx_rst_clk.h>
#include <MDR32F9Qx_port.h>
#include <MDR32F9Qx_adc.h>

ADC_InitTypeDef sADC;
ADCx_InitTypeDef sADCx;

void init_adc(void) {
  init_adc_gpio();
  RST_CLK_PCLKcmd((RST_CLK_PCLK_RST_CLK | RST_CLK_PCLK_ADC), ENABLE);

  ADC_DeInit();
  ADC_StructInit(&sADC);

  ADCx_StructInit(&sADCx);
  sADCx.ADC_ClockSource = ADC_CLOCK_SOURCE_CPU;
  sADCx.ADC_SamplingMode = ADC_SAMPLING_MODE_SINGLE_CONV;
  sADCx.ADC_ChannelSwitching = ADC_CH_SWITCHING_Disable;
  sADCx.ADC_ChannelNumber = ADC_CH_ADC3;
  sADCx.ADC_Channels = 0;
  sADCx.ADC_LevelControl = ADC_LEVEL_CONTROL_Disable;
  sADCx.ADC_LowLevel = 1000;
  sADCx.ADC_HighLevel = 2000;
  sADCx.ADC_VRefSource = ADC_VREF_SOURCE_INTERNAL;

  sADCx.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_INEXACT;
  sADCx.ADC_Prescaler = ADC_CLK_div_2048;  // important!
  sADCx.ADC_DelayGo = 0xF;

  ADC1_Init(&sADCx);
  ADC2_Init(&sADCx);

  ADC1_ITConfig((ADCx_IT_END_OF_CONVERSION), ENABLE);
  ADC2_ITConfig((ADCx_IT_END_OF_CONVERSION), ENABLE);

  // NVIC_EnableIRQ(ADC_IRQn);

  ADC1_Cmd(ENABLE);
  ADC2_Cmd(ENABLE);

  uint32_t adc1Dat = 0xFFFFFFFF;
  uint32_t adc2Dat = 0xFFFFFFFF;
  adc1Dat = read_adc_channel(ADC_ID_1, 5);
  adc2Dat = read_adc_channel(ADC_ID_2, 5);
}

void init_adc_gpio(void) {
  PORT_InitTypeDef GPIOInitStruct;
  RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTD, ENABLE);

  GPIOInitStruct.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
  GPIOInitStruct.PORT_PULL_UP = PORT_PULL_UP_OFF;
  GPIOInitStruct.PORT_OE = PORT_OE_IN;
  GPIOInitStruct.PORT_MODE = PORT_MODE_ANALOG;
  GPIOInitStruct.PORT_PD_SHM = PORT_PD_SHM_OFF;
  GPIOInitStruct.PORT_PD = PORT_PD_DRIVER;
  GPIOInitStruct.PORT_FUNC = PORT_FUNC_PORT;
  GPIOInitStruct.PORT_GFEN = PORT_GFEN_OFF;

  GPIOInitStruct.PORT_Pin = IAC_FILT_PIN6;
  PORT_Init(IAC_FILT_PORTD, &GPIOInitStruct);

  GPIOInitStruct.PORT_Pin = IBAT_FILT_PIN9;
  PORT_Init(IBAT_FILT_PORTD, &GPIOInitStruct);

  GPIOInitStruct.PORT_Pin = ADC_VBAT_PIN5;
  PORT_Init(ADC_VBAT_PORTD, &GPIOInitStruct);

  GPIOInitStruct.PORT_Pin = ADC_AC_PIN3;
  PORT_Init(ADC_AC_PORTD, &GPIOInitStruct);
}

uint32_t read_adc_channel(enum AdcID adcItem, uint32_t desChannel) {
  uint32_t status, result, resChennel;
  FlagStatus endStat;

  if (ADC_ID_1 == adcItem) {
    ADC1_ClearOverwriteFlag();
    ADC1_ClearOutOfRangeFlag();

    ADC1_SetChannel(desChannel);
    ADC1_ITConfig(ADC1_IT_END_OF_CONVERSION, ENABLE);
    ADC1_Start();

    do {
      status = ADC1_GetStatus();
      endStat = ADC_GetFlagStatus(ADC1_FLAG_END_OF_CONVERSION);
    } while (endStat != SET);

    result = ADC1_GetResult();
    resChennel = ADC_CHANNEL_MASK & result;
    resChennel = resChennel >> 16;
    if (resChennel == desChannel) {
      result = 0x0FFF & result;
    } else {
      result = 0xFFFFFFFF;
    }
    ADC1_ClearOverwriteFlag();
    ADC1_ClearOutOfRangeFlag();
  }

  if (ADC_ID_2 == adcItem) {
    ADC2_ClearOverwriteFlag();
    ADC2_ClearOutOfRangeFlag();

    ADC2_SetChannel(desChannel);
    ADC2_ITConfig(ADC2_IT_END_OF_CONVERSION, ENABLE);
    ADC2_Start();

    do {
      status = ADC2_GetStatus();
      endStat = ADC_GetFlagStatus(ADC2_FLAG_END_OF_CONVERSION);
    } while (endStat != SET);

    result = ADC2_GetResult();
    resChennel = ADC_CHANNEL_MASK & result;
    resChennel = resChennel >> 16;
    if (resChennel == desChannel) {
      result = 0x0FFF & result;
    } else {
      result = 0xFFFFFFFF;
    }
    ADC2_ClearOverwriteFlag();
    ADC2_ClearOutOfRangeFlag();
  }

  return (result);
}



Считывание напряжения стало после того как я уменьшил частоту тактирования ADC периферии.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB