Jump to content
Guest Semen

Ацп дает одинаковый резцльтат

Recommended Posts

Guest Semen

Пользуюсь платой stm32f103vet6. Пытался запустить ацп и мерить напряжение на PA0 через потенциометр (10к) напряжение. Опорное = 3,3 волтта.  При подачи на  PA0 любого напряжения результат счета = 2000 +/-. И на ноге PA0 всегда висит 1.6 вольт если она никуда не подключена. Режим работы ацп - регулярный.  Помоги пожалуйста.

Share this post


Link to post
Share on other sites

Вы ваш кусок кода где инициализируете ацп лучше покажите. И пробовали с другого пина считывать?

Share this post


Link to post
Share on other sites
Guest Semen

void init_adc(void)
{
  //включаем тактирование порта А
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
  //включаем тактирование АЦП
  RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
  //настраиваем порт А0 на аналоговый режим
  GPIOA->CRL &= ~((0x3 << GPIO_CRL_CNF0_Pos)|(0x3 << GPIO_CRL_MODE0_Pos));      // сбрасываем настройки порта
  
  //настраиваем ацп
  //ADC1->SMPR2 &= (~(0x7 << ADC_SMPR2_SMP0_Pos));//выбираем скорость выборки АЦП
  ADC1->SMPR2 |= (0x7 << ADC_SMPR2_SMP0_Pos);
  ADC1->CR2 |= ADC_CR2_EXTSEL; //преобразование простое, которое включается от SWSTART
  ADC1->CR2 |= ADC_CR2_CONT;   // постоянное преобразование
  //ADC1->CR2 &= ~ADC_CR2_CONT;   // одиночное преобразование
  
  //ADC1->CR2 |= ADC_CR2_ADON;    //включаем АЦП
  //ADC1->SMPR2 |= (0x0 << ADC_SMPR2_SMP0_Pos);
  
  ADC1->SQR1 &= 0x00000000;
  ADC1->SQR2 &= 0x00000000;
  ADC1->SQR3 &= 0x00000000;      
  ADC1->SQR3 |= 0x00000001;     //используем только нулевой
  ADC1->CR2 |= ADC_CR2_ADON;    //включаем АЦП
  ADC1->CR2 |= ADC_CR2_CAL;             //калибровка
  while((!(ADC1->CR2) & ADC_CR2_CAL));     //ждем пока не закончится колибровка
  ADC1->CR2 |= (4 << ADC_CR2_SWSTART_Pos); //включаем преобразование регулярной группы
  
}
 

Share this post


Link to post
Share on other sites

Тестирование литиевых батареек Fanso в нормальных условиях

Компания Компэл, эксклюзивный дистрибьютор компании Fanso, предлагает широкий перечень ЛХИТ, позволяющий подобрать элемент питания, в наибольшей степени соответствующий конкретным требованиям. Для тестирования параметров, указанных в Datasheet, специалисты Компэл организовали в апреле 2019 г. полугодовой тест на постоянный разряд в нормальных условиях четырех наиболее популярных моделей литий-тионилхлоридных и литий-диоксидмарганцевых батареек Fanso.

Посмотреть результаты первого среза

В 26.05.2019 в 00:22, Гость Semen сказал:

И на ноге PA0 всегда висит 1.6 вольт если она никуда не подключена.

Тут два варианта, либо она куда-то подтянута на плате, либо, что более вероятно, криво настроена. Настройка должна выглядеть примерно так:

GPIOA -> CRL &= ~ GPIO_CRL_MODE0;
GPIOA -> CRL &= ~ GPIO_CRL_CNF0;

 

А настройка АЦП примерно так:

RCC->CFGR    &= ~RCC_CFGR_ADCPRE;      
RCC->CFGR    |= RCC_CFGR_ADCPRE_DIV2;      

RCC->APB2ENR |=  RCC_APB2ENR_ADC1EN;  

ADC1->SQR3   |=  ADC_SQR3_SQ1_0; 
ADC1->CR2    |=  ADC_CR2_EXTSEL;       
ADC1->CR2    |=  ADC_CR2_EXTTRIG;      

ADC1->CR2    |=  ADC_CR2_ADON;        

ADC1->CR2 |= ADC_CR2_CAL;   
while (!(ADC1->CR2 & ADC_CR2_CAL));

ADC1->CR2    |=  ADC_CR2_SWSTART;     

 

И на форме ответа есть кнопка вставки кода...

Share this post


Link to post
Share on other sites

Может оно реально такое и есть, что мультиметр показывает?

Share this post


Link to post
Share on other sites

Новое бюджетное семейство микроконтроллеров STM32G0 и планы его развития

Семейство STM32G0 сочетает в себе лучшие качества представителей семейств STM32F0 и STM32L0 - относительно высокую производительность и низкое энергопотребление. Модели STM32G0 имеют упрощенную схему питания, улучшенную периферию, систему тактирования и быстрые порты в/в, доп.средства защиты ПО, повышенную устойчивость к статическим разрядам, широкий ассортимент корпусов, обновленные пакеты библиотек для STM32CubeMX. STMicroelectronics планирует развивать новое семейство.

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

Guest Semen

мультиметр показывает 1,6 В. есть подозрение что делитель (красный круг) в работе находится, т.е. не отключается. Хотя настраиваю на аналоговый вход.

И кстати BARS_ твой код не проходит цикл while (!(ADC1->CR2 & ADC_CR2_CAL));, по каким то причинам бит калибровки не ставится.

Порты.png

Share this post


Link to post
Share on other sites
Guest Semen

BARS_ извини все ставится. Но проблема все таки осталась. если даю на порт А0 любое напряжение от 0 до 3,3 вольта, результат измерения ацп не меняется. все так же около 2000 +\-

Share this post


Link to post
Share on other sites
Posted (edited)

Настройки порта самого те?

Edited by john2103

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 KVAnton
      Всем привет, начал недавно STM32 осваивать (до этого были pic12-18/arduino/raspberry) и столкнулся с интересной проблемой:
      Настроил GPIO как Input Pull-Up но при считывании получаю 0.
      Условия:
      Несколько других также настроенных портов (Input Pull-Up) при этом посажены на землю (на один порт Output Open-Drain), а непосредственно перед считыванием переключаю другой порт Output Open-Drain Pull-Up с 1 на 0.
      При этом, если поставить задержку (пробовал 1мс) после переключения OutPut и считыванием Input получаю - 1, как и должно быть. Порты по схеме ни как не связанны - пробовал вообще отключать input порт от схемы (матрица кнопок) ситуация не меняется.
      Работаю с китайской платой на stm32f103c8t6 (ардуино подобная) и библиотекой LL. Скорость порта пробовал разную - результат один.
      Сможет кто-то объяснить или хотя бы намекнуть (куда копать, что почитать) почему такой эффект возможен?
      Во всяких даташитах/аппликейшн ноте вроде ни чего интересного, зацепила только аббревиатура  SSO ( simultaneous switching output) в разделе Adapt GPIO speed (в AN на GPIO) - но понять глубину этой фразы и контекста с ходу не получилось (возможно из-за непонимания каких-то базовых моментов)
      Хотя и проблема в принципе решена (задержка допустима) - но хотелось бы разобраться в причинах.
      Буду благодарен любым вариантам, может что-то натолкнет на правильные мысли.
    • By katet
      Добрый день. Может быть,кто-нибудь уже сталкивался с таким. 
      Занимаюсь доработкой чужого проекта в среде STM32CubeMX, первый раз работаю с библиотекой HAL.
      В этом проекте осуществлялся прием байт по USART1 из ComMon. Проект был открыт в STM32CubeMX, где мной дополнительно были активированы новые модули - RTC, SD, USART2. Настройки USART1 не менялись. 
      Часы реального времени RTC: питание от батарейки, тактирование – от LSE. 
      При приеме байт по USART1 в новом проекте (активны  USART1, RTC, SD, USART2) было выявлено, что после приема 2 байт по USART1 перестает инкрементироваться значение переменной uwTick, отвечающей за прерывания Systick, в результате чего дальнейшая отладка невозможна. Не удается выяснить, в каком месте и почему перестает увеличиваться значение uwTick. При работе со старым проектом (где активен только USART1) uwTick инкрементируется после приема 2 байт.
      Смены приоритета прерываний не происходит, в  функцию HAL_Delay() отладчик не попадает. При вызове функции HAL_ResumeTick(), возобновляющей прерывания Systick, ничего не меняется, значение uwTick остается неизменным.
      Остановка прерываний была обнаружена при попадании в функцию:
      static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
      {
        /* Wait until flag is set */
        while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) 
        {
          /* Check for the Timeout */
          if(Timeout != HAL_MAX_DELAY)
          {            
            if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
            {
              /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
              CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
              CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
              
              huart->gState  = HAL_UART_STATE_READY;
              huart->RxState = HAL_UART_STATE_READY;
              
              /* Process Unlocked */
              __HAL_UNLOCK(huart);
              
              return HAL_TIMEOUT;
            }
          }
        }
        
        return HAL_OK;
      }
      В новом проекте текущее значение uwTick, возвращаемое функцией HAL_GetTick(), всегда равно значению Tickstart. В старом проекте сначала также, но затем uwTick начинает увеличиваться. Выяснить, в каком именно месте кода значение uwTick должно начать увеличиваться, не удается.
      Может быть, у кого-нибудь есть хоть какие-то идеи, с чем может быть связана остановка увеличения значений uwTick, помогите пожалуйста)
      Распиновка и конфигурация обоих проектов: верхняя часть рисунков - первоначальный, работающий вариант,  нижняя - сбой прерываний Systick.


    • By _qwerty
      Добрый день. Продам
      отладочные платы для STM32
      Отладочная плата на базе MCU STM32F429ZIT6 (ARM Cortex-M4) - 2600 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F407VGT6 (ARM Cortex-M4) - 1600 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F303VCT6 (ARM Cortex-M4) - 1200 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F103RBT6 (ARM Cortex-M3) - 1000 р. В наличии 2 шт. образовательный набор Амперка Tetra для обучения детей прикладному программированию на основе визуального языка Scratch - 4500 р. В наличии 2 шт.
      электронный конструктор БХВ-Петербург Дерзай 36608 Стартовый набор Arduino - 1500 р. В наличии 2 шт.
      Все новое, не использовалось, возможна отправка почтой по России


















    • By ChaNger16ua
      Здравствуйте, недавно начал заниматься stm32, до этого занимался только Arduino/AVR. Купил себе плату с чипом STM32F103C8T6, и программатор ST-Link v2.
      Сразу же начал искать себе подходящую IDE, остановил свой выбор на CoIDE. И когда начал, проблем с загрузкой, и компиляцией программы не было, управлял всем через регистры, и радостно мигал светодиодом, но когда решил проверить как работает отладка, столкнулся с проблемой. При запуске отладки проект компилировался и загружался, но сама отладка выдавала ошибку: Cannot execute this command without a live selected thread. Перерыл весь интернет, ничего не помогло. 
      Взял уже пример с миганием светодиода из библиотеки GPIO, поменял название функции на int main, поставил return, и дописал строку которая включает SWD. Вот сам код:
      #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" int main(void) { int i; /* Initialize Leds mounted on STM32 board */ GPIO_InitTypeDef GPIO_InitStructure; /* Initialize LED which connected to PC6,9, Enable the Clock*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Configure the GPIO_LED pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); while (1) { /* Toggle LEDs which connected to PC6*/ GPIOC->ODR ^= GPIO_Pin_13; /* delay */ for(i=0;i<0x100000;i++); } return 0; } Запускаю, и ничего та же ошибка.
      После решил сам все не делать, а создать проект в STM32CubeMX. Делал по многим примерам(код кидать не буду он стандартный). Правильно настраивал порты, в пинах sys выставил значение Serial Debug, выставил тактирование. Кидаю проект, все правильно выставляю(папки Drivers, Src, Inc), потом в конфигурации во вкладке компилятор, выставляю переменные. Компилирую, выдает такую строку:
      Program Size: text data bss dec hex filename 0 0 0 0 0 NewMain.elf тоесть программы по сути нет, это в настройках линкера во вкладке options стоит галочка на: Use memory layout from memory window.
      Окей знаю что линкер просто не подключает нужные библиотеки и файлы, поэтому программа ничего не весит.
      Снимаю галочку, ставлю Scatter file, который сделала STM32CubeMX, запускаю.
      Дальше выдает ошибку, но не компиляции, вылазит окно Problem Occurred, нажимаю details, там такое:
      An internal error occurred during: "Building". String index out of range: -1 И все, компиляция прервана. НО если очистить проект, и потом сбилдить(либо ребилд), то работает, но заветный светодиод не моргает.
      Дальше касательно отладки, в нее не могу зайти, потому что при отладке проект компилируется, но я его не могу скомпилировать, могу перебилдить, и поэтому отладка тупо не включается, но есть я очищу проект, то отладка просто не работает.
       
      P.S перемычки на плате менял, как угодно, и с одной прошивкой и другой, не работает. Пытался освоить uVision, не пошло, куча проблем с ней, хотя уже и по гайдам делал(по нескольким), и сам все пытался. Но в итоге как не работало, так и не работает.
      Поэтому прошу помощи.
    • By IgnatiusF
      Не удается проинициализировать работу UART2 на скорость 19200 бод.
      Не вызывается прервание совсем, отсылаются постоянно нули на всех скоростях, если ставить System clock switch в 01 (HSE). При работе от RC генератора выдает уже просто не то, что нужно. 
      Кварц рабочий, и вообще все работает, при использовании библиотек HAL.
      SysTick выключил потому, что были подозрения на конлфикт приоритетов.
      Внизу представлена именно та часть кода программы, которая не работает, то есть сам UART.
      Проект скоро сдавать, а использовать готовую библиотеку HAL не хочется совсем, уже несколько дней парюсь и не могу найти проблему. Попробовал разобраться что пишет в регистры HAL, однако не смог т.к. не хватает знаний, значения регистров все такие же, кроме PLL (не используется) и RCC_CR1 (в HAL почему-то полностью равен 0). Проверял передачей данных по UART. Регистр BRR не удалось считать т.к. он только для записи. У меня записано так:
      USART1->BRR = 0x412;  //20MHz/16/19200 = 65,104.
      Где искать следует ошибку?
  • Сообщения

    • Да сколько угодно. Цифровые запоминающие осциллографы, регистраторы данных.  Все это есть на  Алиэкспрессе. Можно даже  дешевенький конструктор собрать из модулей оттуда же.    А для чего я вам вот это написал? Это вы предлагаете, чтобы хлеб за ртом бегал?   Это у вас интерес. Только вы знаете сколько стоит ваше время, актуальность проблемы и вашу готовность что-то оптимизировать. Только вы формулируете ТЗ и знаете сколько можете  себе позволить потратить на его реализацию.  Ну и напоследок по поводу Это не перегиб, а лицо вашей фирмы. Это возможность планировать ваше время и поездки,  устранив внезапные выезды на аварии, предотвращать простои оборудования клиента своевременной профилактикой/превентивным ремонтом и  возможность ввести SLA для клиентов. За что они  же и заплатят сами.    
    • Добавлю: ещё и далеко не каждый тестер умеет точно измерять такие малые сопротивления.
    • Делайте выводы, чем вы будете дышать во время работы и насколько хватит этого ремонта.
    • Ну если человек не знает, что из себя представляет синфазный дроссель фильтра и нашёл "стабилитрон" на входе ИИП, то других выводов, кроме как "вроде", "мне кажется" и "где копать" ожидать не приходится.  Я требую выпустить КРАБа с гауптвахты! 
    • А что-меньше? Счастливый человек-не сталкивался видимо. Удачи!
    • Первая ссылка в яндексе поделилась https://elektrotanya.com/sony_xr-ca660x.pdf/download.html Чего беспомощные все такие?
×
×
  • Create New...