Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2020, 20:31

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Adc в stm32
СообщениеДобавлено: 13 апр 2012, 22:37 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
Нужно подключить аналоговый датчик и снять с него показания. Раньше делал это через ацп в атмеге, но там и у датчика и в меге опорное напряжение 5в было, а в stm32 это как решается? Там же вроде 3,3


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 13 апр 2012, 22:49 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
обычно 3.3В, но в некоторых есть вход внешнего Vref
вот пример кода инициализации и измерения нескольких каналов:
Код:
void setup_adc(void) {
   GPIO_InitTypeDef GPIO_InitStructure;
   ADC_InitTypeDef  ADC_InitStructure;

   // initialize GPIO
   GPIO_StructInit(&GPIO_InitStructure);
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   //configure ADC
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

   ADC_StructInit(&ADC_InitStructure);
   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_NbrOfChannel = 1;
   ADC_Init(ADC1, &ADC_InitStructure);

   ADC_Cmd(ADC1, ENABLE);

   ADC_ResetCalibration(ADC1);
   while(ADC_GetResetCalibrationStatus(ADC1));

   ADC_StartCalibration(ADC1);
   while(ADC_GetCalibrationStatus(ADC1));
}

const U8 adc_channels[] = {1,0,2,4,3};
for (adc_channel=0; adc_channel<ADC_CHANNELS; adc_channel++) {
   ADC_RegularChannelConfig(ADC1, adc_channels[adc_channel], 1, ADC_SampleTime_41Cycles5);
   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
   while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
   U16 adc = ADC_GetConversionValue(ADC1);
   delay_us(100);
}


Последний раз редактировалось reptile 13 апр 2012, 22:51, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 13 апр 2012, 22:51 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
обычно 3.3В, но в некоторых есть вход внешнего Vref
вот пример кода инициализации и измерения нескольких каналов:
Код:
void setup_adc(void) {
   GPIO_InitTypeDef GPIO_InitStructure;
   ADC_InitTypeDef  ADC_InitStructure;

   GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // disable SWD pins

   // initialize GPIO
   GPIO_StructInit(&GPIO_InitStructure);
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   //configure ADC
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

   ADC_StructInit(&ADC_InitStructure);
   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_NbrOfChannel = 1;
   ADC_Init(ADC1, &ADC_InitStructure);

   ADC_Cmd(ADC1, ENABLE);

   ADC_ResetCalibration(ADC1);
   while(ADC_GetResetCalibrationStatus(ADC1));

   ADC_StartCalibration(ADC1);
   while(ADC_GetCalibrationStatus(ADC1));
}

      for (adc_channel=0; adc_channel<ADC_CHANNELS; adc_channel++) {
         ADC_RegularChannelConfig(ADC1, adc_channels[adc_channel], 1, ADC_SampleTime_41Cycles5);

            ADC_SoftwareStartConvCmd(ADC1, ENABLE);
            while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
            U16 adc = ADC_GetConversionValue(ADC1);
            delay_us(100);
         }


Я в апаратной части знатный тупик, а это сопротивление нада между датчиком и ногой контроллера ставить чтобы до 3,3 упало?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 13 апр 2012, 22:53 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
если выход датчика до 5В, то конечно нужен делитель до 3.3В


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 13 апр 2012, 23:01 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
если выход датчика до 5В, то конечно нужен делитель до 3.3В


А нет случайно стандартной схемки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 13 апр 2012, 23:09 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
нижняя схемка http://ukpyr.narod.ru/calc_res.htm?lang=eng
U1=5V, U2=3.3V, R2=10K, R1=?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 13 апр 2012, 23:14 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
нижняя схемка http://ukpyr.narod.ru/calc_res.htm?lang=eng
U1=5V, U2=3.3V, R2=10K, R1=?

А если поставить переменик то можно уровень максимума задавать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 14 апр 2012, 00:00 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
можно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 14 апр 2012, 18:20 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
можно


спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 14 апр 2012, 21:10 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
обычно 3.3В, но в некоторых есть вход внешнего Vref
вот пример кода инициализации и измерения нескольких каналов:
Код:
void setup_adc(void) {
   GPIO_InitTypeDef GPIO_InitStructure;
   ADC_InitTypeDef  ADC_InitStructure;

   // initialize GPIO
   GPIO_StructInit(&GPIO_InitStructure);
   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   //configure ADC
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

   ADC_StructInit(&ADC_InitStructure);
   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_NbrOfChannel = 1;
   ADC_Init(ADC1, &ADC_InitStructure);

   ADC_Cmd(ADC1, ENABLE);

   ADC_ResetCalibration(ADC1);
   while(ADC_GetResetCalibrationStatus(ADC1));

   ADC_StartCalibration(ADC1);
   while(ADC_GetCalibrationStatus(ADC1));
}

const U8 adc_channels[] = {1,0,2,4,3};
for (adc_channel=0; adc_channel<ADC_CHANNELS; adc_channel++) {
   ADC_RegularChannelConfig(ADC1, adc_channels[adc_channel], 1, ADC_SampleTime_41Cycles5);
   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
   while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
   U16 adc = ADC_GetConversionValue(ADC1);
   delay_us(100);
}



а какой библиотекой вы пользуетесь? у меня например GPIO_Mode_IPU нет :(

у меня библиотека

******************************************************************************
* @file stm32f4xx_gpio.h
* @author MCD Application Team
* @version V1.0.0
* @date 30-September-2011
* @brief This file contains all the functions prototypes for the GPIO firmware
* library.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 14 апр 2012, 21:18 
Старожил

Зарегистрирован: 10 авг 2011, 19:26
Сообщения: 632
у меня другая - для STM32F1xx


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 15 апр 2012, 10:32 
Заглядывает иногда

Зарегистрирован: 28 мар 2012, 17:24
Сообщения: 65
reptile писал(а):
у меня другая - для STM32F1xx


А правильнее какой пользоваться?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Adc в stm32
СообщениеДобавлено: 15 апр 2012, 11:10 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 14 июл 2011, 01:36
Сообщения: 72
Откуда: Москва
andrikus писал(а):
А правильнее какой пользоваться?

Той,которая для Вашего чипа :)


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


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


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

Сейчас этот форум просматривают: rigor_mortis


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB