Developer от Бога

DV

четверг, 6 июля 2017 г.

STM32. ADC (АЦП)

ADC, он же АЦП - превращает аналоговый электрический сигнал в его числовой эквивалент. Максимальная разрядность АЦП в STM32F407VG - 12 бит, чего достаточно даже для неплохой записи звука. Например для диапазона измерений в 3V, шаг его шкалы будет равен:
3/4095=0.00073V
Это значит, АЦП будет улавливать изменение напряжения всего в 0.00073V. Впрочем, такая детализация измерений не всегда нужна, поэтому есть режимы работы АЦП в 10, 8, и 6 бит.
Есть множество настроек работы преобразователя:
Программирование 16 каналов, которые будут сканироваться по очереди, и выдавать значения каждого измерения. Также есть возможность использовать внешний источник запуска преобразователя. Передача преобразованных данных по DMA, настройки таймингов между преобразованиями и многое другое.
Минимальная настройка АЦП совсем не сложная, я бы даже сказал - проще только генератор случайных чисел RNG, со своими тремя регистрами. Хотя благодаря количеству каналов, и соответственно регистров к ним , настройка АЦП кажется сложной.
Есть еще небольшое различие внутри АЦП, это инжектированные и регулярные каналы.
Прерывание как и везде на "периферии" может срабатывать на некоторых событиях, например таких как достижение заданного минимального или максимального значения на входе АЦП (функция watchdog), ну и конечно при готовности данных после преобразования.
STM32F407VG имеет три ADC, с одинаковыми по названиям и функциям регистрами, а также отдельная группа регистров C_ADC которая сообщает о происходящем на всех ADC в целом.
Как и при работе с любой другой периферией, случае использования внешних источников измерения, нужно сделать общий ноль.
Адреса регистров ADC:


  1. //.........ADC1........
  2. #define RCC_ADC *((uint32_t*)0x40023844)
  3. #define ADC1_SR *((uint32_t*)0x40012000)
  4. #define ADC1_CR1 *((uint32_t*)0x40012004)
  5. #define ADC1_CR2 *((uint32_t*)0x40012008)
  6. #define ADC1_SMPR1 *((uint32_t*)0x4001200C)
  7. #define ADC1_SMPR2 *((uint32_t*)0x40012010)
  8. #define ADC1_JOFR1 *((uint32_t*)0x40012014)
  9. #define ADC1_JOFR2 *((uint32_t*)0x40012018)
  10. #define ADC1_JOFR3 *((uint32_t*)0x4001201C)
  11. #define ADC1_JOFR4 *((uint32_t*)0x40012020)
  12. #define ADC1_HTR *((uint32_t*)0x40012024)
  13. #define ADC1_HTR *((uint32_t*)0x40012024)
  14. #define ADC1_LTR *((uint32_t*)0x40012028)
  15. #define ADC1_SQR1 *((uint32_t*)0x4001202C)
  16. #define ADC1_SQR2 *((uint32_t*)0x40012030)
  17. #define ADC1_SQR3 *((uint32_t*)0x40012034)
  18. #define ADC1_JSQR *((uint32_t*)0x40012038)
  19. #define ADC1_JDR1 *((uint32_t*)0x40012048)
  20. #define ADC1_JDR2 *((uint32_t*)0x4001204C)
  21. #define ADC1_JDR3 *((uint32_t*)0x40012050)
  22. #define ADC1_JDR4 *((uint32_t*)0x40012054)
  23. #define ADC1_DR *((uint32_t*)0x4001204C)
  24. //.........ADC2.......
  25. #define ADC2_SR *((uint32_t*)0x40012100)
  26. #define ADC2_CR1 *((uint32_t*)0x40012104)
  27. #define ADC2_CR2 *((uint32_t*)0x40012108)
  28. #define ADC2_SMPR1 *((uint32_t*)0x4001210C)
  29. #define ADC2_SMPR2 *((uint32_t*)0x40012110)
  30. #define ADC2_JOFR1 *((uint32_t*)0x40012114)
  31. #define ADC2_JOFR2 *((uint32_t*)0x40012118)
  32. #define ADC2_JOFR3 *((uint32_t*)0x4001211C)
  33. #define ADC2_JOFR4 *((uint32_t*)0x40012120)
  34. #define ADC2_HTR *((uint32_t*)0x40012124)
  35. #define ADC2_HTR *((uint32_t*)0x40012124)
  36. #define ADC2_LTR *((uint32_t*)0x40012128)
  37. #define ADC2_SQR1 *((uint32_t*)0x4001212C)
  38. #define ADC2_SQR2 *((uint32_t*)0x40012130)
  39. #define ADC2_SQR3 *((uint32_t*)0x40012134)
  40. #define ADC2_JSQR *((uint32_t*)0x40012138)
  41. #define ADC2_JDR1 *((uint32_t*)0x40012148)
  42. #define ADC2_JDR2 *((uint32_t*)0x4001214C)
  43. #define ADC2_JDR3 *((uint32_t*)0x40012150)
  44. #define ADC2_JDR4 *((uint32_t*)0x40012154)
  45. #define ADC2_DR *((uint32_t*)0x4001214C)
  46. //........ADC3......
  47. #define ADC3_SR *((uint32_t*)0x40012200)
  48. #define ADC3_CR1 *((uint32_t*)0x40012204)
  49. #define ADC3_CR2 *((uint32_t*)0x40012208)
  50. #define ADC3_SMPR1 *((uint32_t*)0x4001220C)
  51. #define ADC3_SMPR2 *((uint32_t*)0x40012210)
  52. #define ADC3_JOFR1 *((uint32_t*)0x40012214)
  53. #define ADC3_JOFR2 *((uint32_t*)0x40012218)
  54. #define ADC3_JOFR3 *((uint32_t*)0x4001221C)
  55. #define ADC3_JOFR4 *((uint32_t*)0x40012220)
  56. #define ADC3_HTR *((uint32_t*)0x40012224)
  57. #define ADC3_HTR *((uint32_t*)0x40012224)
  58. #define ADC3_LTR *((uint32_t*)0x40012228)
  59. #define ADC3_SQR1 *((uint32_t*)0x4001222C)
  60. #define ADC3_SQR2 *((uint32_t*)0x40012230)
  61. #define ADC3_SQR3 *((uint32_t*)0x40012234)
  62. #define ADC3_JSQR *((uint32_t*)0x40012238)
  63. #define ADC3_JDR1 *((uint32_t*)0x40012248)
  64. #define ADC3_JDR2 *((uint32_t*)0x4001224C)
  65. #define ADC3_JDR3 *((uint32_t*)0x40012250)
  66. #define ADC3_JDR4 *((uint32_t*)0x40012254)
  67. #define ADC3_DR *((uint32_t*)0x4001224C)
  68. #define ADC_CSR *((uint32_t*)0x40012300)
  69. #define ADC_CCR *((uint32_t*)0x40012304)
  70. #define ADC_CDR *((uint32_t*)0x40012308)

Комментариев нет:

Отправить комментарий