Продолжаем работать с периферией. И вот вопрос: кто-нибудь ещё кроме меня пробовал пользовать АЦП? Если да, какие ваши впечатления и как вам удалось заставить работать его лучше всего?
Расскажу пока о своих текущих наблюдениях:
Расскажу пока о своих текущих наблюдениях:
- Странности встречают нас сразу на этапе настройки: источник опоры выбирают два бита, EXTPAD и EXTEN, что даёт выбор между встроенным ИОНом, когда они оба 0, внешним входом, когда они оба 1 (наверное), и...чем ещё? Или эти два бита следует изменять вместе и синхронно, иначе будет нерабочая схема?
- Посмотрим далее в HAL_ADC_Init():
C:
#ifdef MIK32V0 hadc->Instance->ADC_CONFIG |= (hadc->Init.EXTRef << ADC_CONFIG_EXTREF_S) | /* Настройка источника опорного напряжения */ (hadc->Init.EXTClb << ADC_CONFIG_EXTPAD_EN_S); /* Выбор внешнего источника опорного напряжения */ #else // MIK32V2 hadc->Instance->ADC_CONFIG = (hadc->Instance->ADC_CONFIG & (~ADC_CONFIG_SAH_TIME_M)) | ((hadc->Instance->ADC_CONFIG >> 1) & ADC_CONFIG_SAH_TIME_M) | (hadc->Init.EXTRef << ADC_CONFIG_EXTREF_S) | /* Настройка источника опорного напряжения */ (hadc->Init.EXTClb << ADC_CONFIG_EXTPAD_EN_S); /* Выбор внешнего источника опорного напряжения */ #endif // MIK32V0 }
- Кстати про этот параметр, SAH_TIME: как правило, при замедлении скорости работы в АЦП уровень шумов снижается, но, похоже, не с этим контроллером. Пробовал менять значение этих битов, и единственная замеченная разница, что при уменьшении значения ниже какого-то порога, АЦП, похоже, перестаёт работать. А младшие разряды отсчётов дёргаются примерно одинаково.
- Величина встроенной опоры у моего чипа оказалась где-то в районе 1,215В (смотрел уровень напряжения на входе, которое давало результат 0x0FFF). Пробовал подстраивать её, меняя значения битов COEF_REFICLB и COEF_REFVCLB от нуля до максимума, и...похоже это не даёт ничего. По крайней мере, разницу в шумах я не заметил. Так что не понятно, то ли подстройка на самом деле не работает, то ли я что-то делаю не так?