реклама на сайте
подробности

 
 
8 страниц V  « < 5 6 7 8 >  
Reply to this topicStart new topic
> AT90PWM3, Ничего не понимаю - это только у меня так?
KBB
сообщение Apr 19 2007, 13:20
Сообщение #91


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 19-05-06
Пользователь №: 17 254



мда.
при беглом просмотре не видно ..
но..
мысль про компилятор (какой к стасти?) верная м.б.
исходя из косяков IAR я бы отказался от вской возможной оптимизации
битовых констант и увеличил стэк.
это первое.
связанное с этим же:
осмелюсь предложить способ отладки.(или поиска льва в пустыне)
опять же из опыта IAR.
я бы закомментировал функции управления мотором(напрочь) и повесил светодиоды на ноги. объясняю зачем. параметры лучше передавать в явном виде и кратно двум байтам. лучше всего вообще 2 байта. повторюсь - это применительно к IAR. там же , если оптимизировать собираюсь, то писать надо как на паскале. просто до безобразия, с явной инициализацией. иначе терятся много чего.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 19 2007, 17:40
Сообщение #92


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(VladimirYU @ Apr 19 2007, 08:47) *
__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 (это ДА или НЕТ)?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Apr 20 2007, 10:16
Сообщение #93


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Спасибо за предложения обязательно попробую, но. Я полагал, что макросы определяющие имена PINB_Bit2 и тому подобное позволяют использовать их как булевы переменные, если я не прав, поясните доходчиво, чтобы в голове ясность наступила. Глаз на самом деле замылился, да и мозги уже клинит. Я в IAR подобные конструкции использовал не один десяток раз никогда не было проблем, может быть я удачно ходил по минному полю? Хотелось бы понять.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Apr 20 2007, 11:54
Сообщение #94


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Сделал теперь вот так, ввел опрос вех четырех кнопок. Стоп по любой из стоповых кнопок, запуск по любой из пусковых при усовии что не нажата ни одна из стоповых. Результат тот же, та группа, которая
работала так и работает. Из неработающей группы на ПУСК ни какой реакции, на СТОП "висяк". Вроде ушел от булевых переменных, а эффект ноль. Можно на это дело положить прибор, но хочется разобраться, уж больно контроллер удобный дляприводческих приложений. Я уже к нему и 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;
}
Go to the top of the page
 
+Quote Post
KBB
сообщение Apr 20 2007, 13:22
Сообщение #95


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 19-05-06
Пользователь №: 17 254



ну что сказать?
давай проект (если под IAR)бум смотреть.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 20 2007, 15:03
Сообщение #96


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(VladimirYU @ Apr 20 2007, 07:54) *
Сделал теперь вот так, ввел опрос вех четырех кнопок. Стоп по любой из стоповых кнопок, запуск по любой из пусковых при усовии что не нажата ни одна из стоповых. Результат тот же, та группа, которая
работала так и работает. Из неработающей группы на ПУСК ни какой реакции, на СТОП "висяк". Вроде ушел от булевых переменных, а эффект ноль. Можно на это дело положить прибор, но хочется разобраться, уж больно контроллер удобный дляприводческих приложений. Я уже к нему и 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), что
Цитата(VladimirYU @ Apr 18 2007, 09:37) *
Функция опроса одна и та же, все четыре пина одинаково подтянуты через 10к к +5в и через 1к к земле.
То есть в ненажатом состоянии на ножке будет 0.45В, что явно не будет логической единицей, которая должна быть 0.6*Vcc=3В минимум. А в нажатом состоянии будет 0В. Возможно здесь кроется причина ваших бед. Померяйте напряжения при нажатой и отпущенной кнопке, если не будет соответствующих логических уровней, то оторвите резистор 1к от земли и опять померяйте.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Apr 20 2007, 15:12
Сообщение #97


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(KBB @ Apr 20 2007, 14:22) *
ну что сказать?
давай проект (если под IAR)бум смотреть.


На выходных прицеплю ПВМ3 к JTAG MKII, по твоему совету выкину все из проекта кроме кнопок,
посмотрю что будет. Результаты сообщу.
Go to the top of the page
 
+Quote Post
DeXteR
сообщение May 17 2007, 15:45
Сообщение #98


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



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

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

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

Как это сделать ?? (если не сложно кусочек кода)
Go to the top of the page
 
+Quote Post
bezobraznic
сообщение May 18 2007, 07:06
Сообщение #99


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-05-05
Пользователь №: 5 441



Цитата(DeXteR @ May 17 2007, 18:45) *
УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

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

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

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



Если без буквы Б то надо ставить внешний инвертор!! Это глюк АТМЕЛ!!
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение May 18 2007, 07:36
Сообщение #100


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(DeXteR @ May 17 2007, 19:45) *
УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

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

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

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


Код не поможет, если без B, то либо внешний инвертор, а еще лучше драйвер для управления верхним и нижним транзистором IR2110, например. Кстати в СПб ЭФО B уже продает
Go to the top of the page
 
+Quote Post
KBB
сообщение May 26 2007, 18:40
Сообщение #101


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 19-05-06
Пользователь №: 17 254



Цитата(VladimirYU @ May 18 2007, 15:36) *
Код не поможет, если без B, то либо внешний инвертор, а еще лучше драйвер для управления верхним и нижним транзистором IR2110, например. Кстати в СПб ЭФО B уже продает


когда говорим в противофазе (или инверсно), что имеем ввиду?
при 50% заполнении или что?
узкий импульс всяко поочереди на выходах (00-01)
даже у PWM2.
чего-то не догоняю?
Go to the top of the page
 
+Quote Post
GREG_
сообщение Jun 21 2007, 14:00
Сообщение #102





Группа: Новичок
Сообщений: 1
Регистрация: 21-06-07
Пользователь №: 28 605



Может кому будет интересно, запустил сегодня аналоговый вход по AMP0 на PWM3 (не cool.gif. Мучался в течение полдня, но результат налицо, прикол состоит в том, что конец преобразования по каналам AMP0 и AMP1 определяется не по флагу ADIF, а в момент перехода ADSC из 1 в 0, что подтверждает диаграмка в даташите на ст. 262 (у меня версия 4317В-AVR-02/05). Получается что ADIF при работе с дифференциальными аналоговыми входами как бы не причем, соответственно и прерывание подключить невозможно.
Go to the top of the page
 
+Quote Post
_lukash_
сообщение Nov 4 2007, 10:59
Сообщение #103


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-09-07
Из: Винница
Пользователь №: 30 222



Всем привет!

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

Уже как раз заказывать нужно эти МК, а я немного запутался в их багахsmile.gif
Go to the top of the page
 
+Quote Post
Руст
сообщение Mar 10 2008, 18:48
Сообщение #104





Группа: Новичок
Сообщений: 1
Регистрация: 10-03-08
Пользователь №: 35 785



Народ помогите пожалуйста!!!!!!
У меня был комплект STK500/ Теперь я еще приобрел MC100? поскольку занимаюсь приводом.....
Так вот я вычитал, что их мона соединить и управлять двигателем через прогу Motor Control Center...
Все сделал как написано, но не работает!:(((((
Эта самая прога все время пишет Target out of sync и Could not synchronize target......
target это у них так названа mc100 вместе с движком.
Пробовал и на ноутбуке и компе с COM портом - ничего не помогаетsad.gif
Кто имел этот опыт - ПАМАГИТЕ!!!!!
ПАМАГИТЕ все кто можете! В чем может быть дело?
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Mar 11 2008, 06:25
Сообщение #105


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(_lukash_ @ Nov 4 2007, 13:59) *
Всем привет!

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

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


1. Это еще не все, в rev. A у меня не работает AMP1.
2. Управляете только верхними ключами, а на нижние подаете задание обеспечивающее постоянно открытое состояние ( естественно соблюдая закон коммутации).
Go to the top of the page
 
+Quote Post

8 страниц V  « < 5 6 7 8 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2025 - 01:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01484 секунд с 7
ELECTRONIX ©2004-2016