Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 55
1

Не работает АЦП

05.06.2020, 14:39. Просмотров 1064. Ответов 9

Здравствуйте, столкнулся с проблемой работы АЦП в связки с ili9341 дисплеем.

Такой же проект собирал на hd44780, в котором использовал 6 каналов АЦП, задавал условия нужные для проекта и выводил их на дисплей. АЦП с использованием DMA, да и в режиме Interrupt пробовал, все работало.

Решил сделать более красивее, с использованием ili9341 дисплея по SPI. Так вот подключил его к spi3 который на шине APB1 и взял DMA1. Вывел текст, все хорошо отработало. По одному начал подключать ADC1 который на шине APB2 и взял DMA2, и он никак не реагирует, снизил частоту на шине, увеличил делитель на АЦП, ничего не заработало ни с DMA ни в Interrupt, начал работать только когда я вручную начал опрашивать его с периодичностью миллисекунда. Если учесть все преобразования в конфиге частоты, то получается что АЦП работает чуть больше чем 1МГц, (168/(16*8)). И все равно с DMA не работает даже 1 канал.
Уменьшил частоту на шине APB1 которая работает с spi3 и DMA1, уменьшил настолько что отчетливо вижу как экран заполняется при заливке кода. Но показания АЦП так и не выводятся, просто зависают рандомные значения. Я так понял что такое обычно происходит при загруженности ядра, ему не хватает частоты обработать код.

Мне что-то не верится что 168МГц не могут обработать периферию spi&dma 10.5МГц (168/16) и ADC 1.31МГц (168/(16*8)), причем больше в коде ничего нет, никаких доп алгоритмов и условий. Или в чем может быть проблема? В том что 2 DMA или ему правда не хватает "мощности".

Моя конфигурация: STM32F407vet6, использую HAL и в Kile uVision.

Максимально типичный способ вывода информации:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void TFT9341_DrawChar(uint16_t x, uint16_t y, uint8_t c)
{
  uint32_t i = 0, j = 0;
  uint16_t height, width;
  uint8_t offset;
  uint8_t *c_t;
  uint8_t *pchar;
  uint32_t line=0;
  height = lcdprop.pFont->Height;
  width  = lcdprop.pFont->Width;
  offset = 8 *((width + 7)/8) -  width ;
  c_t = (uint8_t*) &(lcdprop.pFont->table[(c-' ') * lcdprop.pFont->Height * ((lcdprop.pFont->Width + 7) / 8)]);
  for(i = 0; i < height; i++)
  {
    pchar = ((uint8_t *)c_t + (width + 7)/8 * i);
    switch(((width + 7)/8))
    {
      case 1:
          line =  pchar[0];      
          break;
      case 2:
          line =  (pchar[0]<< 8) | pchar[1];
          break;
      case 3:
      default:
        line =  (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];      
        break;
    }
    for (j = 0; j < width; j++)
    {
      if(line & (1 << (width- j + offset- 1))) 
      {
        TFT9341_DrawPixel((x + j), y, lcdprop.TextColor);
      }
      else
      {
        TFT9341_DrawPixel((x + j), y, lcdprop.BackColor);
      } 
    }
    y++;
  }
}
 
void TFT9341_String(uint16_t x,uint16_t y, char *str)
{
  while(*str)
  {
    TFT9341_DrawChar(x,y,str[0]);
    x+=lcdprop.pFont->Width;
    (void)*str++;
 
        HAL_SPI_Transmit_DMA(&hspi3, (uint8_t*) str, sizeof(str)-1);
  }
}
Вот основной код:
C
1
2
3
4
5
6
7
8
9
10
11
12
HAL_ADC_Start_DMA(&hadc1,(uint32_t*) &ADC_Data,4);
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        
        V[0]=((float)ADC_Data[0])*3/4096;
        sprintf(sting,"%.2fV.",V[0]);
        TFT9341_String(165,26,sting);
.....
ничего необычного.

Может кто-то занимался подобным? Надеюсь на совет.
0
Миниатюры
Не работает АЦП   Не работает АЦП  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2020, 14:39
Ответы с готовыми решениями:

Не работает АЦП, HELP!!!
Никак не хочет работать АЦП, точнее не генерируется флаг окончания преобразования EOC. Выставляю...

АЦП работает только в отладке.
Подскажите. Во время дебага АЦП работает хорошо. Но как только заливаю код в процессор, то ничего...

stm8s003f3 АЦП не правильно работает, помогите
Промучался с этим процом достаточно, через все эти грабли как у всех. Но такого нету нигде. При...

Не работает АЦП
Вечер добрый. Понадобилось мне АЦП сделать на меге8й, да вот испытания в Протеусе ничего хорошего...

9
811 / 493 / 160
Регистрация: 30.07.2015
Сообщений: 1,623
05.06.2020, 18:06 2
Rustam98, тут разговор не о "мощности". Ваша задача ничего не стоит в плане процессорного времени. Искать надо в инициализации DMA или АЦП.
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 55
05.06.2020, 19:56  [ТС] 3
Цитата Сообщение от _SayHello Посмотреть сообщение
Ваша задача ничего не стоит в плане процессорного времени
Что это значит?

Цитата Сообщение от _SayHello Посмотреть сообщение
Искать надо в инициализации DMA или АЦП.
Что искать? В обоих случаях инициализацию проводил Куб, но в одном случае использовался hd44780 а в другом ili9341 240x320. В первом все работает во втором нет.
0
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,265
05.06.2020, 20:25 4
Цитата Сообщение от Rustam98 Посмотреть сообщение
В обоих случаях инициализацию проводил Куб
Вот поэтому начинать с автоконфигураторов - плохая идея. Ими можно пользоваться только когда уже хватает знаний разобраться что же они там нагородили.
0
3 / 1 / 2
Регистрация: 02.06.2020
Сообщений: 6
06.06.2020, 10:49 5
А проекты можете выслать/показать полностью - рабочий и нерабочий?
0
Radikal_78
06.06.2020, 17:37
  #6

Не по теме:

Кто к нам пожаловал! 0_0 ))))

0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 55
06.06.2020, 18:23  [ТС] 7
road to the dream)) это на hd44780 но забыл упомянуть что он на i2c шине, ну а второй сами поймете.
0
Вложения
Тип файла: rar ILI9331_SPI.rar (19.57 Мб, 6 просмотров)
Тип файла: rar Road_to_the_dream1.rar (19.52 Мб, 4 просмотров)
3 / 1 / 2
Регистрация: 02.06.2020
Сообщений: 6
06.06.2020, 23:07 8
А если из main() убрать все вызовы TFT9341_xxx - АЦП будет работать?

И в целом программа вообще в HardFault не вылетает случайно? Потому что, например, к функции TFT9341_String() есть вопросы...

C
1
2
3
4
5
6
7
8
9
10
11
void TFT9341_String(uint16_t x,uint16_t y, char *str)
{
  while(*str) 
  {
    TFT9341_DrawChar(x,y,str[0]);
    x+=lcdprop.pFont->Width;
    (void)*str++;
 
    HAL_SPI_Transmit_DMA(&hspi3, (uint8_t*) str, sizeof(str)-1);
  }
}
Начиная с того, что внутри TFT9341_DrawChar тоже выполняется отправка команд по SPI, плюс вызовы HAL_SPI_Transmit_DMA() внутри этого цикла.
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 55
07.06.2020, 20:44  [ТС] 9
АЦП будет работать, так как это полная копия из предыдущего проекта там где все норм.
Я не знаю насчет HardFault, как это узнать?
И то что вы говорите про DMA, я так подумал что да возможно из за этого.
Я попробую собрать проект там где буду использовать 1 DMA в АЦП, я тут внимательно посмотрел на код, и понял что пробовал разные режимы для взаимодействия с ili 9431 и менял только конфигурацию в кубе, но не в с воем коде. Возможно из за этого (точнее скорее всего из за этого).
Цитата Сообщение от Aveal Посмотреть сообщение
плюс вызовы HAL_SPI_Transmit_DMA() внутри этого цикла.
Я не очень понял как использовать DMA с ili 9431, ошибок вообщем много. Буду пробовать по разному, отпишусь если что.
Может подскажите как реализовать вывод текста с DMA?
0
3 / 1 / 2
Регистрация: 02.06.2020
Сообщений: 6
07.06.2020, 21:52 10
Лучший ответ Сообщение было отмечено Rustam98 как решение

Решение

На самом деле именно для работы с дисплеем смысла в DMA нет, на мой взгляд, особого...

Во-первых, в принципе, данные передаются небольшими порциями.

И, во-вторых, даже строку не получится загрузить в дисплей одним "заходом", потому что дисплей поддерживает функционал отрисовки только отдельных пикселей. То есть вывод строки = вывод N символов = вывод N * M пикселей. И каждый пиксель выводится определенной командой с передачей адреса ряда, колонки и цвета. И плюс еще ко всему команды разделяются на "команды" и "данные", в соответствии с чем нужно переключать состояние одного из входов дисплея.

И в итоге мы имеем, что основная идея DMA - загрузил отправку, куча данных передается, процессор в это время свободен - тут особо шансов не имеет.

И еще небольшой нюанс из личного опыта. Отрисовка на дисплее будет сильно быстрее (на порядок), если часть обмена с дисплеем сделать без HAL, на регистрах. Я обычно все в проекте делаю на HAL, в том числе инициализацию SPI, потому что это ни с точки зрения производительности, ни с точки зрения объема занимаемой памяти не критично. Но вот непосредственно выдача данных по SPI на дисплей - вручную, через регистры, потому что это будет работать намного быстрее.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2020, 21:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не работает АЦП меги48
Добрый день. Не могу никак запустить, не пойму, что я делаю не так. Нужно просто вывести значение...

Не работает АЦП STM32F407
Добрый вечер. Имеется следующий код: #include &quot;stm32f4xx.h&quot; // Device header ...

Не работает АЦП Attiny461a
АЦП в реальной выдает постоянно одно и тоже значение (0xFF) при любом напряжении на выводе ADC1. В...

atmega128a не правильно работает АЦП
Доброго дня Подскажите пожалуйста в чем может быть проблема Мне нужно по очерёдно опрашивать 4...

АЦП работает в протеусе не работает в реале!(решена)
Подскажите кому не лень разобраться в чем трабла! Эленентарная прога проверки работы ацп. В...

atmega32 + I2C АЦП AS1538 не работает :(
Пытаюсь измерить напряжение на каналах 4(+) и 5(-), но не получается. Такое впечатление, что АЦП...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.