Однократное и непрерывное измерение ADC: различия между версиями
Дмитрий (обсуждение | вклад) (закомментировал код. добавил подключение UARTa. пронумеровал рисунки (начиная с 3)) |
LemanRuss (обсуждение | вклад) м (Исправление орфографических ошибок) |
||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 2: | Строка 2: | ||
== Работа с конфигуратором (В разработке) == | == Работа с конфигуратором (В разработке) == | ||
Для начала | Для начала настроим в конфигураторе тактирование mik32, например, от внешнего кварца 32МГц. Затем настроим делители шины. Так как АЦП тактируется от шины APB_P_CLK, то зададим делители AHB_DIV и APB_P_DIV. В данном примере оставим делители по умолчанию. В итоге вкладка с тактированием должна выглядеть так: | ||
(Картинка тактирования из конфигуратора. В работе) | (Картинка тактирования из конфигуратора. В работе) | ||
Строка 9: | Строка 9: | ||
После этого появится настройки канала и источника опорного напряжения (ИОН). Выберем 5-й канал АЦП, которому соответствует вывод Port0.9. | После этого появится настройки канала и источника опорного напряжения (ИОН). Выберем 5-й канал АЦП, которому соответствует вывод Port0.9. | ||
[[Файл:Настройки ADC в конфигураторе.png|мини| | [[Файл:Настройки ADC в конфигураторе.png|мини|Рисунок 2 - настройки ADC в конфигураторе]] | ||
В АЦП есть 3 источника опорного напряжения. Внутренний считается встроенным в АЦП. Настраиваемый ИОН и источник от внешнего вывода ADC_REF считаются внешними по отношению к внутреннему ИОН АЦП. Выберем "Внутренний". | В АЦП есть 3 источника опорного напряжения. Внутренний считается встроенным в АЦП. Настраиваемый ИОН и источник от внешнего вывода ADC_REF считаются внешними по отношению к внутреннему ИОН АЦП. Выберем "Внутренний". | ||
Строка 104: | Строка 104: | ||
value = HAL_ADC_WaitAndGetValue(&hadc); | value = HAL_ADC_WaitAndGetValue(&hadc); | ||
xprintf("ADC: %d (V = %d,%03d)\n", value, ((value*1200)/4095)/1000, ((value*1200)/4095)%1000); | |||
for (volatile int i = 0; i < 1000000; i++); | for (volatile int i = 0; i < 1000000; i++); | ||
Строка 165: | Строка 158: | ||
SystemClock_Config(); | SystemClock_Config(); | ||
UART_Init(UART_0, 3333, UART_CONTROL1_TE_M | UART_CONTROL1_M_8BIT_M, 0, 0); | |||
ADC_Init(); | ADC_Init(); | ||
Строка 175: | Строка 170: | ||
value = HAL_ADC_GetValue(&hadc); | value = HAL_ADC_GetValue(&hadc); | ||
xprintf("ADC: %d (V = %d,%03d)\n", value, ((value*1200)/4095)/1000, ((value*1200)/4095)%1000); | |||
for (volatile int i = 0; i < 1000000; i++); | for (volatile int i = 0; i < 1000000; i++); |
Текущая версия от 15:40, 27 августа 2023
В примере будут запущены измерения ADC (АЦП) в однократном и непрерывном режиме.
Работа с конфигуратором (В разработке)
Для начала настроим в конфигураторе тактирование mik32, например, от внешнего кварца 32МГц. Затем настроим делители шины. Так как АЦП тактируется от шины APB_P_CLK, то зададим делители AHB_DIV и APB_P_DIV. В данном примере оставим делители по умолчанию. В итоге вкладка с тактированием должна выглядеть так:
(Картинка тактирования из конфигуратора. В работе)
Затем перейдем к настройке самого АЦП. Для этого откроем вкладку АЦП и нажмем включить.
После этого появится настройки канала и источника опорного напряжения (ИОН). Выберем 5-й канал АЦП, которому соответствует вывод Port0.9.
В АЦП есть 3 источника опорного напряжения. Внутренний считается встроенным в АЦП. Настраиваемый ИОН и источник от внешнего вывода ADC_REF считаются внешними по отношению к внутреннему ИОН АЦП. Выберем "Внутренний".
В итоге настройки таймера в конфигураторе должны выглядеть как на рисунке.
Нажимаем кнопку сохранения и генерации. В итоге у нас появится проект для PlatformIo. Далее работа идет в visual studio code.
Использование библиотеки HAL_ADC
В сгенерированном проекте в файле main.c должна быть функция ADC_Init, в которой будут заданы настройки для ADC. Выглядит она так:
Кроме этого в функции SystemClock_Config приведены настройки для тактирования. Убедитесь что в PeriphClkInit.PMClockAPB_P присутствует PM_CLOCK_ANALOG_REG_M. Для смены функции вывода на аналоговую должен быть затактирован контроллер выводов (в PeriphClkInit.PMClockAPB_M должен быть PM_CLOCK_PAD_CONFIG_M или PMCLOCKAPB_M_DEFAULT). Сама функция должна выглядеть примерно так:
Для демонстрации вывода текста в PeriphClkInit.PMClockAPB_P присутствует PM_CLOCK_UART_0_M. У вас его может не быть так как UART нужно включить отдельно. Для этого нужно подключить библиотеки uart_lib и xprintf.
Для инициализации UART в функции main, после функции тактирования SystemClock_Config, следует написать:
UART_Init(UART_0, 3333, UART_CONTROL1_TE_M | UART_CONTROL1_M_8BIT_M, 0, 0);
Скорость UART задается делителем во втором аргументе функции. При такой записи скорость будет 9600 бод.
В начале main.c можно видеть объявление структуры с набором настроек для АЦП, которую использует функция инициализации ADC_Init.
Для запуска однократного измерения следует использовать функцию HAL_ADC_Single. Для получения значения используйте функцию HAL_ADC_WaitAndGetValue.
Функция main должна выглядеть примерно так:
Подадим на вывод Port0.9 напряжение 0.6В. Вывод UART можно видеть на рисунке 3. АЦП может выводить немного другое значение, так как источники напряжения и сам АЦП имеют погрешность.
Теперь изменим ИОН на внешний от вывода ADC_REF - Port1.10. Это можно сделать в конфигураторе, либо в функции ADC_Init, которая должна выглядеть так:
Функция main без изменений.
Подадим на вывод ADC_REF (Port1.10 ) 1.2В, а на вывод АЦП5 (Port0.9) 0.6В. Вывод UART изображен на рисунке 4. АЦП может выводить немного другое значение, так как источники напряжения и сам АЦП имеют погрешность.
Для запуска АЦП в непрерывном режиме следует использовать функцию HAL_ADC_ContiniusEnable, а для считывания результата преобразования HAL_ADC_GetValue.
Функция main должна выглядеть примерно так:
Подадим на вывод АЦП5 (Port0.9) 0.6В. Вывод UART изображен на рисунке 5. АЦП может выводить немного другое значение, так как источники напряжения и сам АЦП имеют погрешность.