Использование улучшенного ccp1 в pic18f не выводит ШИМ.

Вопрос или проблема

Я реализовывал драйвер для периферийного устройства 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 может быть связана с неправильными значениями в регистрах, неверной конфигурацией портов или ошибками в коде инициализации. Начинайте с проверки настроек регистров и выведения вывода на порты. Если все настройки в порядке, используйте отладку и тестирование в реальной среде, чтобы выявить проблему.

Оцените материал
Добавить комментарий

Капча загружается...