ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
6 мая
1516534 Топик полностью
Бoмж (Сегодня, 11:32, просмотров: 25) ответил Бoмж на Нужно сделать без PEC. Если данные скорости в ответ на запросы по CAN станут корректными, значит PEC запрограммирован неправильно.
Вот второй пример от Грока: 

Чтобы отправлять нормированные данные с АЦП вместо необработанных (RAW), нужно изменить код следующим образом: добавить функцию нормирования, обновлять нормированные данные и настроить PEC для работы с ними. Вот полный пример кода с необходимыми изменениями:


#include <reg167.h>

// Определение констант
#define ADC_CHANNEL 0 // Канал АЦП для датчика скорости
#define CAN_ID_REQUEST 0x100 // Идентификатор CAN для запроса
#define CAN_ID_RESPONSE 0x101 // Идентификатор CAN для ответа

// Переменная для хранения нормированных данных
volatile unsigned int normalized_data;

// Функция нормирования данных
unsigned int normalize_adc(unsigned int raw) {
// Пример нормирования: преобразование 10-битного АЦП (0-1023) в 0-100
return (raw * 100) / 1023;
}

// Инициализация АЦП
void init_adc() {
ADC_CON = 0x0000; // Сброс настроек АЦП
ADC_CON |= (1 << 5); // Включение АЦП
ADC_CON |= (ADC_CHANNEL & 0x0F); // Выбор канала
}

// Инициализация CAN
void init_can() {
CAN_CON = 0x41; // Инициализация CAN-контроллера
// Настройка объекта для приема запросов
CAN_OBJ[0].MCR = 0x5555; // Маска для приема
CAN_OBJ[0].AR = CAN_ID_REQUEST; // Идентификатор запроса
CAN_OBJ[0].MOFCR = 0x0008; // Режим приема
// Настройка объекта для отправки данных
CAN_OBJ[1].AR = CAN_ID_RESPONSE; // Идентификатор ответа
CAN_OBJ[1].MOFCR = 0x0000; // Режим отправки
}

// Настройка PEC
void init_pec() {
PECSRC0 = (unsigned int)&normalized_data; // Источник: нормированные данные
PECDST0 = (unsigned int)&CAN_OBJ[1].DATA[0]; // Назначение: данные CAN
PECC0 = 0x0001; // Передача 1 слова
SRCP0 = (unsigned int)&CAN_OBJ[0].MOFCR; // Срабатывание по приему запроса
PECPTR0 = (unsigned int)&PECC0; // Указатель на настройки PEC
}

// Обновление нормированных данных
void update_normalized_data() {
unsigned int raw = ADC_DAT; // Чтение RAW данных с АЦП
normalized_data = normalize_adc(raw); // Нормирование
}

// Основная функция
void main() {
init_adc(); // Инициализация АЦП
init_can(); // Инициализация CAN
init_pec(); // Инициализация PEC

while (1) {
update_normalized_data(); // Регулярное обновление нормированных данных
// Другие задачи
}
}


  1. Добавлена переменная normalized_data
    Она хранит нормированные значения, которые будут отправляться через CAN.
  2. Создана функция normalize_adc
    Эта функция преобразует RAW данные (0-1023 для 10-битного АЦП) в нормированный диапазон, например, 0-100. Вы можете изменить логику нормирования под свои нужды.
  3. Обновление данных в update_normalized_data
    Функция читает необработанные данные с АЦП, нормирует их и сохраняет в normalized_data. Вызывается в основном цикле для поддержания актуальности данных.
  4. Настройка PEC
    В init_pec источник данных указывает на normalized_data, чтобы PEC автоматически отправлял нормированные значения по запросу через CAN.
  • Убедитесь, что функция update_normalized_data вызывается достаточно часто, чтобы данные оставались актуальными.
  • Если требуется другой диапазон нормирования или тип данных, измените normalize_adc и настройки PEC соответственно.
  • Код использует PEC для минимизации нагрузки на процессор, автоматически отправляя данные при запросе через CAN.
memento mori