Перейти к содержанию
    

мда.

при беглом просмотре не видно ..

но..

мысль про компилятор (какой к стасти?) верная м.б.

исходя из косяков IAR я бы отказался от вской возможной оптимизации

битовых констант и увеличил стэк.

это первое.

связанное с этим же:

осмелюсь предложить способ отладки.(или поиска льва в пустыне)

опять же из опыта IAR.

я бы закомментировал функции управления мотором(напрочь) и повесил светодиоды на ноги. объясняю зачем. параметры лучше передавать в явном виде и кратно двум байтам. лучше всего вообще 2 байта. повторюсь - это применительно к IAR. там же , если оптимизировать собираюсь, то писать надо как на паскале. просто до безобразия, с явной инициализацией. иначе терятся много чего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__C_task int main()

{

 

static bool stopBuffer = false; // буферы для опроса кнопок

static bool runBuffer = false;

 

static char pollCounter = POLL_QUANTITY; // счетчик опосов

 

while (1)

{

_WDR();

 

 

// Проверяем состояние кнопок

if ( (runBuffer == RUN) && (stopBuffer == STOP) ) pollCounter--;

else { runBuffer = RUN; stopBuffer = STOP; pollCounter = POLL_QUANTITY; } // перезапускаем опрос

}

}

 

// как определяются и инициализируются RUN и STOP см. предыдущие посты. Буду рад если ткнешь в ошибку. Есть еще более простой вариант без антидребезга, результат тот же.

Ну а что ж вы хотите, RUN и STOP вы определяете, как ножки, а сравниваете с булевскими переменными. Вот и получается, что в первом варианте у вас кнопки срабатывают каким-то образом, а во втором - нет. Другими словами, лучше в логическом выражении использовать логические переменные. Как можно сравнивать runBuffer (это некое число) с булевой переменной RUN (это ДА или НЕТ)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за предложения обязательно попробую, но. Я полагал, что макросы определяющие имена PINB_Bit2 и тому подобное позволяют использовать их как булевы переменные, если я не прав, поясните доходчиво, чтобы в голове ясность наступила. Глаз на самом деле замылился, да и мозги уже клинит. Я в IAR подобные конструкции использовал не один десяток раз никогда не было проблем, может быть я удачно ходил по минному полю? Хотелось бы понять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал теперь вот так, ввел опрос вех четырех кнопок. Стоп по любой из стоповых кнопок, запуск по любой из пусковых при усовии что не нажата ни одна из стоповых. Результат тот же, та группа, которая

работала так и работает. Из неработающей группы на ПУСК ни какой реакции, на СТОП "висяк". Вроде ушел от булевых переменных, а эффект ноль. Можно на это дело положить прибор, но хочется разобраться, уж больно контроллер удобный дляприводческих приложений. Я уже к нему и MODBUS сверху пристроил, а на фигне застрял. Заранее спасибо откликнувшимся.

 

 

 

__C_task int main()

{

InitWDT(); // инициализация Watchdog

__enable_interrupt(); // глобальное разрешение прерываний

 

/* Фоновый цикл:

1. Читаем направление с джампера J1

2. устанавливаем здание на скорость ( считываем с потенциометра)

3. Проверяем состояние кнопок J2 - пуск, J3 - стоп

*/

 

static char keyBuffer ; // буферы для опроса кнопок

static char keyState ; // текущее состояние кнопок

 

static char pollCounter = POLL_QUANTITY; // счетчик опосов

 

while (1)

{

_WDR();

// 1.

motor.SetDirection ( motor.ReadDirection () ); // установили направление

 

// 2.

// motor.SetupSpeed ( adc.GetPotentiometr() ); // устанавливаем задание на скорость

 

/* 3. Проверяем состояние кнопок ПУСК, СТОП.

Если двигатель включен:

нажата ПУСК - ничего не делаем, нажата любая СТОП - переменную состояния в OFF, двигатель выключаем.

Если двигатель выключен:

нажата ПУСК и не нажата ни одна СТОП - переменную состояния в ON, нажата СТОП - ничего неделаем.

Опрос проводим POLL_QUANTITY раз если результат не изменяется фиксируем состояние кнопок */

 

// Читаем состояние кнопок и пакуем их в keyState в формате MSB <- 0 0 0 0 STOP_FAIL STOP RUN_FAIL RUN <-LSB

// два младших бита ПУСКовые, 2 и 3 биты СТОПовые

 

keyState = PINB & 0x1c; // выделяем кнопки на порте B PINB_Bit4 , PINB_Bit3, PINB_Bit2

keyState >>=2; // сдвигаем

keyState |=( ( PIND & 0x40)>>3); // кнопкой с порта D (PIND_Bit6)

 

// Проверяем состояние кнопок

if ( keyState == keyBuffer ) pollCounter--;

else { keyBuffer = keyState; pollCounter = POLL_QUANTITY; } // перезапускаем опрос

 

// Смотрим закончен ли опрос

if ( pollCounter == 0)

{

pollCounter = POLL_QUANTITY; // переустанавливаем счетчик

switch ( motor.GetState() ) // смотрим состояние двигателя

{

case ON:

{ // проверяем нажата ли хоть одна кнопка СТОП

if ( (keyBuffer&0x0c) != 0x0c ) motor.TurnOFF(); // выключаем

}

break;

 

case OFF:

{

// проверяем условие пуска ( не нажата ни одна СТОП)&(нажата любая ПУСК)

motor.SetupSpeed(0);

if ( ( (keyBuffer&0x0c) == 0x0c ) && ( (keyBuffer&0x03) != 0x03) ) motor.TurnOn(); // включаем двигатель

}

break;

 

default: break;

}

}

}

return 0;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал теперь вот так, ввел опрос вех четырех кнопок. Стоп по любой из стоповых кнопок, запуск по любой из пусковых при усовии что не нажата ни одна из стоповых. Результат тот же, та группа, которая

работала так и работает. Из неработающей группы на ПУСК ни какой реакции, на СТОП "висяк". Вроде ушел от булевых переменных, а эффект ноль. Можно на это дело положить прибор, но хочется разобраться, уж больно контроллер удобный дляприводческих приложений. Я уже к нему и MODBUS сверху пристроил, а на фигне застрял. Заранее спасибо откликнувшимся.

 

// Читаем состояние кнопок и пакуем их в keyState в формате MSB <- 0 0 0 0 STOP_FAIL STOP RUN_FAIL RUN <-LSB

// два младших бита ПУСКовые, 2 и 3 биты СТОПовые

 

keyState = PINB & 0x1c; // выделяем кнопки на порте B PINB_Bit4 , PINB_Bit3, PINB_Bit2

keyState >>=2; // сдвигаем

keyState |=( ( PIND & 0x40)>>3); // кнопкой с порта D (PIND_Bit6)

 

// Проверяем состояние кнопок

if ( keyState == keyBuffer ) pollCounter--;

else { keyBuffer = keyState; pollCounter = POLL_QUANTITY; } // перезапускаем опрос

 

// Смотрим закончен ли опрос

if ( pollCounter == 0)

{

pollCounter = POLL_QUANTITY; // переустанавливаем счетчик

switch ( motor.GetState() ) // смотрим состояние двигателя

{

case ON:

{ // проверяем нажата ли хоть одна кнопка СТОП

if ( (keyBuffer&0x0c) != 0x0c ) motor.TurnOFF(); // выключаем

}

break;

 

case OFF:

{

// проверяем условие пуска ( не нажата ни одна СТОП)&(нажата любая ПУСК)

motor.SetupSpeed(0);

if ( ( (keyBuffer&0x0c) == 0x0c ) && ( (keyBuffer&0x03) != 0x03) ) motor.TurnOn(); // включаем двигатель

}

break;

 

default: break;

}

}

}

return 0;

}

Ну с точки зрения грамматики си и логики вроде всё нормально стало. Единственно, вы keyBuffer не определяете при первом сравнении, но вроде не должно влиять.

 

Ещё обратил внимание, судя по программе, что нажатая кнопка у вас даёт логический 0, а ненажатая даёт 1. Но ранее вы писали (см.пост #81), что

Функция опроса одна и та же, все четыре пина одинаково подтянуты через 10к к +5в и через 1к к земле.
То есть в ненажатом состоянии на ножке будет 0.45В, что явно не будет логической единицей, которая должна быть 0.6*Vcc=3В минимум. А в нажатом состоянии будет 0В. Возможно здесь кроется причина ваших бед. Померяйте напряжения при нажатой и отпущенной кнопке, если не будет соответствующих логических уровней, то оторвите резистор 1к от земли и опять померяйте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну что сказать?

давай проект (если под IAR)бум смотреть.

 

На выходных прицеплю ПВМ3 к JTAG MKII, по твоему совету выкину все из проекта кроме кнопок,

посмотрю что будет. Результаты сообщу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

 

Прошу откликнуться тех кто работал с ПВМ3 (без буквы Б)

 

Возможно ли запустить PSC с симетричным ШИМ так чтоб один канал был в противофазе к другому ??

 

Как это сделать ?? (если не сложно кусочек кода)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

 

Прошу откликнуться тех кто работал с ПВМ3 (без буквы Б)

 

Возможно ли запустить PSC с симетричным ШИМ так чтоб один канал был в противофазе к другому ??

 

Как это сделать ?? (если не сложно кусочек кода)

 

 

Если без буквы Б то надо ставить внешний инвертор!! Это глюк АТМЕЛ!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

 

Прошу откликнуться тех кто работал с ПВМ3 (без буквы Б)

 

Возможно ли запустить PSC с симетричным ШИМ так чтоб один канал был в противофазе к другому ??

 

Как это сделать ?? (если не сложно кусочек кода)

 

Код не поможет, если без B, то либо внешний инвертор, а еще лучше драйвер для управления верхним и нижним транзистором IR2110, например. Кстати в СПб ЭФО B уже продает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код не поможет, если без B, то либо внешний инвертор, а еще лучше драйвер для управления верхним и нижним транзистором IR2110, например. Кстати в СПб ЭФО B уже продает

 

когда говорим в противофазе (или инверсно), что имеем ввиду?

при 50% заполнении или что?

узкий импульс всяко поочереди на выходах (00-01)

даже у PWM2.

чего-то не догоняю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кому будет интересно, запустил сегодня аналоговый вход по AMP0 на PWM3 (не B). Мучался в течение полдня, но результат налицо, прикол состоит в том, что конец преобразования по каналам AMP0 и AMP1 определяется не по флагу ADIF, а в момент перехода ADSC из 1 в 0, что подтверждает диаграмка в даташите на ст. 262 (у меня версия 4317В-AVR-02/05). Получается что ADIF при работе с дифференциальными аналоговыми входами как бы не причем, соответственно и прерывание подключить невозможно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет!

 

Тож пытаюсь собрать схему управление BLDC на этих МК :)

За основу взял схему ATAVRMC100. Как я понял, у них она построена на AT90PWM3 ревА. Но ведь в errata на этот МК (версия даташита 4317H–AVR–12/06) сказано (п.5), что

 

5. PSC: Output Polarity in Centered Mode

In centered mode, PSCOUTn1 outputs are not inverted, so they are active at the same time as PSCOUTn0.

Workaround:

Use an external inverter (or a driver with inverting output) to drive the load on PSCOUTn1

 

А ATAVRMC100 ведь использует именно этот режим! Так как же у них оно работало, если в схеме нет инвертора?

 

И еще, все пункты в errata относиться к AT90PWM3 ревА, а в ревБ это все уже исправлено? Т.е. лучше использовать ревБ?

 

Уже как раз заказывать нужно эти МК, а я немного запутался в их багах:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ помогите пожалуйста!!!!!!

У меня был комплект STK500/ Теперь я еще приобрел MC100? поскольку занимаюсь приводом.....

Так вот я вычитал, что их мона соединить и управлять двигателем через прогу Motor Control Center...

Все сделал как написано, но не работает!:(((((

Эта самая прога все время пишет Target out of sync и Could not synchronize target......

target это у них так названа mc100 вместе с движком.

Пробовал и на ноутбуке и компе с COM портом - ничего не помогает:(

Кто имел этот опыт - ПАМАГИТЕ!!!!!

ПАМАГИТЕ все кто можете! В чем может быть дело?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет!

 

Тож пытаюсь собрать схему управление BLDC на этих МК :)

За основу взял схему ATAVRMC100. Как я понял, у них она построена на AT90PWM3 ревА. Но ведь в errata на этот МК (версия даташита 4317H–AVR–12/06) сказано (п.5), что

 

5. PSC: Output Polarity in Centered Mode

In centered mode, PSCOUTn1 outputs are not inverted, so they are active at the same time as PSCOUTn0.

Workaround:

Use an external inverter (or a driver with inverting output) to drive the load on PSCOUTn1

 

А ATAVRMC100 ведь использует именно этот режим! Так как же у них оно работало, если в схеме нет инвертора?

 

И еще, все пункты в errata относиться к AT90PWM3 ревА, а в ревБ это все уже исправлено? Т.е. лучше использовать ревБ?

 

Уже как раз заказывать нужно эти МК, а я немного запутался в их багах:)

 

1. Это еще не все, в rev. A у меня не работает AMP1.

2. Управляете только верхними ключами, а на нижние подаете задание обеспечивающее постоянно открытое состояние ( естественно соблюдая закон коммутации).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...