Jump to content
Zender12

Stm32 Проблемы С Adc (Ацп)

Recommended Posts

Здравствуйте, подскажите пожалуйста где ошибка. Была написана простая программа для STM32F4DISCOVERY использующая АЦП для измерений, был подключён потенциометр на 10kOm средней точкой к выводу PA195_1257184680.jpg .

#include <stm32f4xx.h>
#include <stm32f4xx_rcc.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_adc.h>
int ReadADC1()
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles);
ADC_SoftwareStartConv(ADC1);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
void main(void)
{
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitTypeDef GPIO_STR;
ADC_InitTypeDef ADC_STR;
ADC_CommonInitTypeDef ADC_CSTR;
GPIO_STR.GPIO_Mode=GPIO_Mode_AN;
GPIO_STR.GPIO_Pin=GPIO_Pin_1;

GPIO_Init(GPIOA,&GPIO_STR);

ADC_DeInit();
ADC_CSTR.ADC_Mode=ADC_Mode_Independent;
ADC_CSTR.ADC_Prescaler=ADC_Prescaler_Div2;

ADC_CommonInit(&ADC_CSTR);

ADC_STR.ADC_ContinuousConvMode=DISABLE;
ADC_STR.ADC_DataAlign=ADC_DataAlign_Right;
ADC_STR.ADC_ExternalTrigConv=ADC_ExternalTrigConvEdge_None;
//ADC_STR.ADC_NbrOfConversion=ADC_N
ADC_STR.ADC_Resolution=ADC_Resolution_12b;
ADC_STR.ADC_ScanConvMode=DISABLE;

ADC_Init(ADC1,&ADC_STR);

ADC_Cmd(ADC1,ENABLE);

int adc_temp=0,sum=0;

while(1)
{
for (time = 0; time <= 1000; time++)
{
delay(300);
adc_temp=ReadADC1();
sum+=adc_temp;
}
sum/=1000;
}
}

. Сначала всё замечательно работало но спустя какое-то время без каких-либо изменений в коде и схеме перестала работать. Как выяснилось позже происходит зацикливание на одной из строк кода

 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

. В одно включение программа работает без сбоев, ведутся нормальные замеры, в следующий же раз происходит зацикливание, даже без изменения кода. Даже при удалении участка кода где происходит зацикливание (что насколько я понимаю в корне не верно) приходят неверные данные. Прошу подскажите всё-ли верно в инициализации и использовании АЦП и что может приводить к таким проблемам?

Edited by Zender12

Share this post


Link to post
Share on other sites

1. Неверные замеры могут происходить из-за небольшого входного сопротивления АЦП. Насколько я помню, оно приблизительно равно 20-30 кОм. Поставьте между входом АЦП и источником сигнала буфер.

2. Если программа зависает на проверке статуса флага попробуйте написать эту часть кода с помощью прерываний.

Share this post


Link to post
Share on other sites
Guest Zender12

Можете разьяснить как именно использовать прерывания.

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

                     

Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Связка плат Nucleo и платформы Arduino, и наличие готовых библиотек – представляет удобный инструмент для создания прототипов и конечных приложений в условиях ограниченного времени. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.

Подробнее...

После включения ADC, добавьте

ADC_Cmd(ADC1,ENABLE);

ADC_EOCOnEachRegularChannelCmd(ADC1, ENABLE);

Edited by Oxford

Share this post


Link to post
Share on other sites
Guest Женя

На сколько я понял CooCox использует старые библиотеки std peripheral, при прогоне это го же кода в EM Blocks все отлично работает. Всем СПС.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Стальной
      Здравствуйте!
      Интересует мнение коллег по правильному питанию мощных МК. Имеется STM32F722VCT6. Делаю для себя новый отладочный стенд. На нем будут обкатываться различные задачи, поставлю плюсом к МК всякую периферию, обязательно i2c память (из серии AT24Cxx), MAX3485, возможно какой-то дисплей, SD-карту, может быть SIM900 и NAND. Первичный источник - думаю, USB хватит.
      Вопрос - как организовать питание МК? Имеет ли смысл цифровую часть (а мб и часть периферийного зоопарка) питать импульсной системой, а аналоговую часть кренкой? Или всё кренкой запитать? Какие идеи?
      Спасибо)
      ЗЫ Сейчас использую стенд на STM32F407VET6, сделанный на коленках, все кренкой питается. Но там периферия изготавливается по мере необходимости и надевается отдельно на гребенки.
    • By befrikpa
      Добрый день товарищи!
      У меня такая проблема:
      Я хочу сделать штуку которая будет замыкать реле через определённое время(после подачи питания на него), реле времени так сказать. В принципе устройство работает, но у меня не получается сделать так, что бы светодиод (HL_4) мигал каждые пол секунды пока не включено реле, а после включения соответственно  светодиод горел постоянно.
      Сейчас у меня условие находится в бесконечном цикле, и при включении устройства, светодиод просто горит постоянно и всё.
      Скажу честно, я в программировании пока что зелёный, так что не судите строго за код))
      Прикрепил код:

       
    • By Alextiger62
      Отладочный набор на базе микроконтроллера STM32F746IGT6. Модульная конструкция и открытый дизайн делают плату идеальным решением для начала быстрой разработки устройств. В комплект поставки входят все необходимые модули расширения, для оценки всех возможностей микроконтроллера. 

      Комплектация: 
      1 х Материнская плата (Open746I-C development board); 
      1 х Процессорный модуль (Core746I); 
      1 х Кабель (USB type A plug to micro B plug cable);   - отсутствует
      1 х Кабель (USB type A receptacle to micro B plug cable);   - отсутствует
      1 х Соединительные провода (4-pin 2-pin wires pack);   - отсутствует 
      1 х Блок питания (Power adapter US standard 5V/1A);   - отсутствует
      1 х Дисплей (7inch Capacitive Touch LCD (F)); 
      1 х Плата (DP83848 Ethernet Board); 
      1 х Плата (USB3300 USB HS Board); 
      1 х Плата (UDA1380 Board); 
      1 х Плата (Micro SD Storage Board); 
      1 х Плата (OV2640 Camera Board); 
      1 х Плата (W25QXX DataFlash Board); 
      1 х Плата (10 DOF IMU Sensor (B)); 
      2 х Плата (SN65HVD230 CAN Board); 
      1 х Плата (Analog Test Board); 
      1 х Кабель (USB type A plug to mini-B plug cable);  - отсутствует
      1 х Кабель (USB type A receptacle to mini-B plug cable);   - отсутствует
      1 х Кабель (Ethernet Cable); 
      1 х Шлейф (40-pin FFC);  - отсутствует
      1 х Крепеж (7inch LCD screws pack).
    • By Денис216
      Не могу опросить магнитометр по I2C. На линиях какие-то сигналы проскакивают, но никакого результата не могу достичь. Кто-то что-то знает по этому поводу? Как заставить работать его.


       
      #include "stm32f30x.h"              int a1=0, j=0; int main(void) { RCC->AHBENR|=RCC_AHBENR_GPIOBEN;// тактирование портa B включено RCC->AHBENR|=RCC_AHBENR_GPIOEEN;//21 тактирование портa Е включено RCC->APB1ENR|=RCC_APB1ENR_I2C1EN;// тактирование I2C1 включено GPIOB->MODER|=0x0000A000; // альтернативная функция линий PB7,PB6 GPIOB->OTYPER|=(1<<6);  //настройка линии PB7 на выход открытый сток GPIOB->OTYPER|=(1<<7);  //настройка линии PB6 на выход открытый сток GPIOB->OSPEEDR=0xFFFFFFFF; GPIOB->AFR[0] |= 0x44000000;  //настройка линий PB7,PB6 на функцию AF4 GPIOE->MODER=0x55555555; //настройка порта Е на выход EXTI->EMR=1<<23; EXTI->IMR=1<<23; NVIC_EnableIRQ(I2C1_EV_IRQn); //инициализация I2C мастер I2C1->CR1=(0<<0); //PE=0 I2C1->TIMINGR=(0x4<<28);//PRESC[3:0]: Timing prescaler I2C1->TIMINGR=(0x8<<20);//SCLDEL[3:0]: Data setup time I2C1->TIMINGR=(0x8<<16);//SDADEL[3:0]: Data hold time I2C1->TIMINGR=(0xC3<<8);//SCLH[7:0]: SCL high period (master mode) I2C1->TIMINGR=(0xC7<<0);//SCLL[7:0]: SCL low period (master mode) I2C1->CR1=(0<<17);//для мастера = 0 NOSTRETCH: Clock stretching disable I2C1->CR1=(1<<6);//TCIE: Transfer Complete interrupt enable I2C1->CR1=(1<<2);//RXIE: RX Interrupt enable(RXNE) I2C1->CR1=(1<<1);//TXIE: TX Interrupt enable(TXIS) I2C1->CR2=(0<<11);//ADD10=0 -7 bits I2C1->CR2=(0<<10);//RD_WRN=0 передача I2C1->CR2=(1<<25);//AUTOEND I2C1->CR1|=(1<<0); //PE=1 I2C1->CR2 = 0x03<<1;//adress  I2C1->CR2|=1<<13;//start ?????? a1=I2C1->RXDR;     while (1){     //    I2C1->CR2|=1<<13;//start         if((a1&0x1)>0)    GPIOE->ODR =1<<9;         else            GPIOE->ODR =(0<<9);         if((a1 & 0x2)>0)    GPIOE->ODR |=1<<10;         else            GPIOE->ODR &= ~(1<<10);         if((a1 & 0x4)>0)    GPIOE->ODR |=1<<11;         else            GPIOE->ODR &= ~(1<<11);         if((a1 & 0x8)>0)    GPIOE->ODR |=1<<12;         else            GPIOE->ODR &= ~(1<<12);         if((a1 & 0x10)>0)    GPIOE->ODR |=1<<13;         else            GPIOE->ODR &= ~(1<<13);         if((a1 & 0x20)>0)    GPIOE->ODR |=1<<14;         else            GPIOE->ODR &= ~(1<<14);         if((a1 & 0x40)>0)    GPIOE->ODR |=1<<15;         else            GPIOE->ODR &= ~(1<<15);         if((a1 & 0x80)>0)    GPIOE->ODR |=1<<8;         else            GPIOE->ODR &= ~(1<<8); }} void I2C1_EV_EXTI23_IRQHandler () {a1=2;}  
    • By svd
      Предлагаю печатные платы для паяльной станции на STM32 и OLED дисплее 1,3" версии 2.1S
      Плата делалась под китайский алюминиевый корпус.
      Тема, где обсуждается данная станция T12 , опубликована на сайте radiokot.ru
      Фото платы


      Схема немного доработана:
      1) добавлены блокировочные конденсаторы 0,1 мкФ в цепях микроконтроллера;
      2) добавлен резистор в цепи буззера для возможности снижения громкости;
      3) есть возможность подключать жала JBC (для Т12 в разъеме паяльника запаивается перемычка)

      Большинство элементов типоразмера 0603. DC/DC преобразователь PSR-7805LF можно заменить на любой китайский аналог или микросхему 7805
      Ссылки на возможные замены:
      DC/DC аналог 7805 №1
      DC/DC аналог 7805 №2

      Во вложениях схема и расположение элементов на ПП, чертеж передней панели и прошивка под дисплей 1.3" с контроллером SH1106.

      Цена за одну плату 400 руб c учетом стоимости пересылки по РФ. Количество плат ограничено.
      По всем вопросам просьба обращаться в личку.
       
      STM32_T12_2.1S_SSH1106_1.3_v2_.pdf передняя панель.pdf T12_HW21S_Encryption-SH1106.zip
  • Сообщения

    • Предварительные измерения ПараФинна. 7.5 Ом, 50 Вт 7.5 Ом, 10 Вт.  
    • @kotenok изучи сам сперва конституцию РФ , Разобрался... поздравляю Я тебя в игнор не заносил
    • Я то понял, что ты себя дебилом назвал. Наконец то с кнопкой игнора разобрался. Адью придурок!
    • JLCPCB Prototype for $2(Any Color): https://jlcpcb.com   Сборка и тестирование активной антенны miniwhip от RA0SMS. Теория активной антенны miniwhip: http://www.ra0sms.ru/p/mini-whip.html Репозиторий антенны: https://github.com/IgrikXD/Easy-SDR Страница проекта на Easyeda: https://easyeda.com/IgrikXD/Antenna_Mini_Whip_SMD-74e9e6740b814f6c901a811855125754   Прошлые наши видео по теме радиоприема GNU Radio - Декодирование RDS https://www.youtube.com/watch?v=eaYfEJfiH7E Обзор SDR приемника на RTL2832 https://www.youtube.com/watch?v=Qw7SHv1f6_I RTL SDR приемник https://www.youtube.com/watch?v=zfuJzl3Z_XE WebSDR для новичков. Часть 1 https://www.youtube.com/watch?v=xO2qf9-BDUQ WebSDR для новичков. Часть 2 https://www.youtube.com/watch?v=ygr1kLvlIUg
    • @rocker60  так это все из сети, там еще есть с трансформатором  вторичные обмотки 2х7в. У самого были какие то, работали потом резко показывали 7D, не исправна была микросхема счетчика.
    • @kotenok кошак, я тебе все сказал, умный прочтет, даун умолкнет @kotenok срись по углам, тебе в модераторы уже не войти никогда
    • Схема достойная внимания. Только хочу внести пожелание. Начинать надо не с 0.7 и 1.0 вольта. А хотя бы с 5 - 6 вольт, а лучше с 9, учитывая потери в кабеле и его протяжённости. Для коротких кабелей и Ваша схема вполне подходит. Ещё надо учесть и возможность измерительного прибора на приёмной стороне. Таким ширпотребом как DT-830 и ему подобным, трудно будет уловить разницу между 0 и 0.7 вольт. А если ещё добавить сопротивление линии, а она есть. В телефонии, для для прозвонки длинных линий используют как минимум 12 вольтовое питание, а иногда и более высокое. Такому напряжению потери на линии не так страшны.
×
×
  • Create New...