Вопрос или проблема
Я реализовывал драйвер для периферийного устройства ccp1, и после его реализации и использования Proteus для симуляции улучшенный ШИМ не работает, хотя я убедился, что CCP1CON загружен правильно, как и T2CON, и я не знаю, в чем проблема.
Он должен выдавать ШИМ с заполняемостью 50% при 20 кГц с P1A, P1C, оба активные низкие, и P1B, P1D, оба активные высокие.
Согласно даташиту, выход полный мост вперед, P1D модулированный; P1A активен; P1B, P1C неактивны.
Вот регистры CCP1CON и T2CON, а также TRISC и TRISD:
Код:
#include "app.h"
#include "device_config.h"
#include "MCAL_Layer/CCPx/CCP1/hal_ccp1.h"
#include "MCAL_Layer/Timers/Timer3/hal_timer3.h"
#include "MCAL_Layer/Timers/Timer2/hal_timer2.h"
cpp1_t ccp1_obj = {
.ccp1_interrupt_handler = NULL,
.ccp1_interrupt_priority = INTERRUPT_LOW_PRIORITY,
.ccp1_mode = CCP1_PWM_MODE_SELECT,
.ccp1_mode_variant = CCP1_PWM_MODE_P1AC_LOW_P1BD_HIGH,
.ccp1_pwm_output_config = FULL_BRIDGE_OUTPUT_FORWARD,
.ccp1_pwm_frequency = 20000,
.timer2_postscaler_value = 1,
.timer2_prescaler_value = 1
};
timer2_t timer2_obj = {
.PR2_preloaded_value = 99,
.TMR2_preloaded_value = 0,
.postscaler_value = 1,
.prescaler_value = 1
};
int main(void)
{
Std_ReturnType ret = E_OK;
ret |= ccp1_init(&ccp1_obj);
ret |= timer2_init(&timer2_obj);
ccp1_pwm_set_duty_cycle(50);
while (1)
{
}
return (ret);
}
Я не знаю, что делать после этого, и он не выдает ШИМ.
Ответ или решение
Вопрос о том, почему Enhanced CCP1 на микроконтроллере PIC18F не генерирует сигнал ШИМ (PWM), требует внимательного анализа всех задействованных компонентов и настроек. Ниже приведены ключевые аспекты для выявления и решения данной проблемы.
1. Настройки регистров CCP1 и T2
В первую очередь убедитесь, что регистры CCP1CON и T2CON настроены корректно. Из вашего описания видно, что вы настраиваете CCP1 для работы в режиме ШИМ, однако необходимо проверить каждое значение битов:
-
CCP1CON: Убедитесь, что биты, отвечающие за выбор режима ШИМ, установлены правильно. Например, если вы используете
CCP1_PWM_MODE_SELECT
, проверьте бит 0 (CCP1M3) и бит 1 (CCP1M2) регистров, которые должны быть настроены на соответствующий режим. -
T2CON: Аналогично, проверьте настройки таймера 2, включая биты предделителя и постделителя. Для генерации сигнала с частотой 20 кГц, правильно настроенное значение PR2 имеет критическое значение. Для 20 кГц и заданного предделителя необходимо установить значение PR2 так, чтобы оно соответствовало желаемой частоте на основе частоты системного генератора.
2. Настройка выводов PWM (TRISC и TRISD)
Следующий момент заключается в правильной настройке портов ввода/вывода. Убедитесь, что:
- TRISC и TRISD: Все выводы Порта C и D, где подключены P1A, P1B, P1C, P1D, выставлены в режим вывода (0). Если какой-либо из этих выводов установлен в режим ввода (1), это может стать причиной отсутствия сигнала.
3. Параметры частоты и скважности
Ваш код устанавливает 50% скважность при ccp1_pwm_set_duty_cycle(50);
. Убедитесь, что данная функция правильно вычисляет величину задержки. Для настройки 50% скважности на выводе должно быть установлено соответствующее значение в регистр PWM. Проверьте, что значение, устанавливаемое для скважности, корректно относится к величине счетчика PR2.
4. Программная отладка
Добавьте в ваш главный цикл несколько отладочных выводов или замерьте временные интервалы, чтобы убедиться, что ваши функции инициализации работают корректно. Включите прерывания, если они используются в вашей программе, чтобы отследить выполнение кода.
5. Симуляция в Proteus
При использовании Proteus, убедитесь, что вы правильно подключили устройство к вашей схемe. Проверьте следующие моменты:
- Все необходимые компоненты, включая источник питания.
- Настройки эмуляции: в некоторых версиях Proteus могут быть проблемы с эмуляцией определённых функций, поэтому также можно попытаться протестировать на реальной плате.
6. Документация и примеры
Не забудьте обратиться к документации производителя, в которой описывается работа с CCP и PWM. Часто можно найти пример реализации, который мог бы помочь лучше понять, как правильно настроить все регистры.
Итог
Проблема отсутствия сигнала PWM может быть связана с неправильными значениями в регистрах, неверной конфигурацией портов или ошибками в коде инициализации. Начинайте с проверки настроек регистров и выведения вывода на порты. Если все настройки в порядке, используйте отладку и тестирование в реальной среде, чтобы выявить проблему.