Jump to content

    
Sign in to follow this  
osnwt

AT90PWM3

Recommended Posts

мда.

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

но..

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

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

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

это первое.

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

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

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

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

Share this post


Link to post
Share on other sites
__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 (это ДА или НЕТ)?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

}

Share this post


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

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

Share this post


Link to post
Share on other sites
ну что сказать?

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

 

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

 

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

 

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

 

 

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

Share this post


Link to post
Share on other sites
УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

 

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

 

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

 

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

 

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

Share this post


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

 

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

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

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

даже у PWM2.

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Всем привет!

 

Тож пытаюсь собрать схему управление 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 ревА, а в ревБ это все уже исправлено? Т.е. лучше использовать ревБ?

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Всем привет!

 

Тож пытаюсь собрать схему управление 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. Управляете только верхними ключами, а на нижние подаете задание обеспечивающее постоянно открытое состояние ( естественно соблюдая закон коммутации).

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this