roboforum.ru

Технический форум по робототехнике.


dccharacter - Излить посильно

Блоги посетителей.
Правила форума
В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.

Re: dccharacter - Излить посильно

Сообщение linvinus » 21 авг 2012, 03:17

В общем, покопался и пришёл к следующему выводу - чисто аппартно не получится, им бы пришлось встроить отдельный блок управления, который бы занимался только управлением, а добавить сюда ещё несколько вариантов ШИМ и вообще контроллер не нужен будет :),для этого есть готовые микросхемы.
но он и так очень легко управляется, в том примере что ты дал как то усложнено на мой взгляд.
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: dccharacter - Излить посильно

Сообщение dccharacter » 21 авг 2012, 03:33

Как проще?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение linvinus » 22 авг 2012, 00:29

мне больше нравится когда всё, что можно не вычислять постоянно, лежит в массиве, и тупо читаешь из него.
в данном случае всё
всё содержимое BLDCMotorPrepareCommutation
можно свести к (это для chibios)
static uint32_t bldc_state[19]={
тут перечень настроек CCER,CCMR1,CCMR2 для всех шести состояний
}

...
BLDCMotorPrepareCommutation(){
PWMD1.tim->CCER = bldc_state[h_pos];
PWMD1.tim->CCMR1 = bldc_state[h_pos+6];
PWMD1.tim->CCMR2 = bldc_state[h_pos+12];
}
Я сейчас с разными типами pwm разбираюсь, оказывается есть такой pwm при котором направление вращения закодированно внём самом, что приколько работает и для bldc.
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: dccharacter - Излить посильно

Сообщение dccharacter » 22 авг 2012, 01:51

linvinus писал(а):Я сейчас с разными типами pwm разбираюсь, оказывается есть такой pwm при котором направление вращения закодированно внём самом, что приколько работает и для bldc.

Блин, ну рассказывай же! Все из тебя тянуть приходится, а приходишь ты раз в три дня!
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение linvinus » 22 авг 2012, 02:00

Тут есть цикл статей про pwm - "So, Which PWM Technique is Best"
http://e2e.ti.com/group/motor/b/blog/default.aspx

а я сделал по этой схеме
http://e2e.ti.com/group/motor/b/blog/ar ... art-5.aspx
начало про неё тут
http://e2e.ti.com/group/motor/b/blog/ar ... art-4.aspx

честно говоря пока непонятно почему с bldc работает в обе стороны (в моей текущей реализации), пока заметил что в одном из направлений момент слабее чем в другом
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: dccharacter - Излить посильно

Сообщение dccharacter » 22 авг 2012, 02:20

А свою-то схему нарисуй? А то непонятно как ты сумел экстраполировать логику брушед на брушлесс.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение Dmitry__ » 22 авг 2012, 03:54

dccharacter писал(а):как ты сумел экстраполировать логику брушед на брушлесс.

Вау, не отец, но мужчина :crazy:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: dccharacter - Излить посильно

Сообщение linvinus » 22 авг 2012, 04:18

Так в каждый момент времени инвертор можно рассматривать как H-мост, только со временем меняются плечи.
локига простая, у нас есть комплементарные пары, и таймер в режиме счёта вверх-вниз.
одна проблема инвертировать нижний сигнал, т.е. если у левого плеча pwd 80%, то у правого должно быть 20%
и это двигается во времени в зависимости от состояния датчиков hall.
Собственно весь код, без инициализации.
extcb_hall вызывается по внешнему прерыванию на порту B
использую TIM1

Код: Выделить всёРазвернуть
/*
    you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
*/
#define HA (TIM_CCER_CC1E)
#define HB (TIM_CCER_CC2E)
#define HC (TIM_CCER_CC3E)
#define LA (TIM_CCER_CC1NE)
#define LB (TIM_CCER_CC2NE)
#define LC (TIM_CCER_CC3NE)

#define PDP1_CCW (HB|LB|LA|HA)
#define PDP2_CCW (HC|LC|LA|HA)
#define PDP3_CCW (HC|LC|LB|HB)
#define PDP4_CCW (HA|LA|LB|HB)
#define PDP5_CCW (HA|LA|LC|HC)
#define PDP6_CCW (HB|LB|LC|HC)

#define CH_A 0x0
#define CH_B 0x1
#define CH_C 0x2

#define PDP1_INVERT_CH (CH_B<<2|CH_A)
#define PDP2_INVERT_CH (CH_C<<2|CH_A)
#define PDP3_INVERT_CH (CH_C<<2|CH_B)
#define PDP4_INVERT_CH (CH_A<<2|CH_B)
#define PDP5_INVERT_CH (CH_A<<2|CH_C)
#define PDP6_INVERT_CH (CH_B<<2|CH_C)

static uint32_t bldc_state[13]={
   0,
   PDP2_CCW,
   PDP4_CCW,
   PDP3_CCW,
   PDP6_CCW,
   PDP1_CCW,
   PDP5_CCW,

   PDP2_INVERT_CH,
   PDP4_INVERT_CH,
   PDP3_INVERT_CH,
   PDP6_INVERT_CH,
   PDP1_INVERT_CH,
   PDP5_INVERT_CH,
}

int bldc_speed;


void extcb_hall(){
   h_pos = (palReadPort(GPIOB) & (7<<12))>>12;
   if(h_pos==0 ||h_pos>6)
      return;

  PWMD1.tim->CCER = bldc_state[h_pos];

  *(&PWMD1.tim->CCR1 + ((bldc_state[h_pos+6]&0x3) * 2)) = PWMD1.tim->ARR - bldc_speed;
  (*(&PWMD1.tim->CCR1 + (((bldc_state[h_pos+6]&0xC)>>2) * 2)))=bldc_speed;
}



Добавлено спустя 5 минут 55 секунд:
если bldc_speed < PWMD1.tim->ARR/2 то вращение в одну сторону , иначе в другую
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: dccharacter - Излить посильно

Сообщение dccharacter » 22 авг 2012, 05:28

По-моему вот тут ошибка:
#define PDP1_CCW (HB|LB|LA|HA)
#define PDP2_CCW (HC|LC|LA|HA)
#define PDP3_CCW (HC|LC|LB|HB)
#define PDP4_CCW (HA|LA|LB|HB)
#define PDP5_CCW (HA|LA|LC|HC)
#define PDP6_CCW (HB|LB|LC|HC)

В каждый момент времени у тебя должны только два мосфета быть открыты. А ты четыре открываешь. Кажется.

#define PDP1_CCW (HA|LB)
#define PDP2_CCW (HA|LC)
#define PDP3_CCW (HB|LC)
#define PDP4_CCW (HB|LA)
#define PDP5_CCW (HC|LA)
#define PDP6_CCW (HC|LB)

Добавлено спустя 10 минут 12 секунд:
Кстати, в СТМ32 каналы можно _теоретически_ инвертировать сменой режима PWM1<->PWM2. Пишу "теоретически", потому что сейчас ловлю с этим адские глюки!
Или просто полярность поменять. Короче математика эта лишняя вся.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение linvinus » 22 авг 2012, 14:28

Ошибки нет, в комплементарном режиме открыт только один транзистор в плече. Ещё настроен dead-time на 98ns
PWM1 это режим выравнивания по краю
PWM2 это режим выравнивания по центру, его я и использую.
для того чтобы работало выравнивание по центру нужно чтобы счётчик читал вверх вниз, за это отвечают биты TIM_CR1_CMS_1 | TIM_CR1_CMS_0 в регистре CR1
PWMD1.tim->CR1 = (TIM_CR1_ARPE | TIM_CR1_URS | TIM_CR1_CMS_1 | TIM_CR1_CMS_0 | TIM_CR1_CEN)
посмотри документацию на регистры CR1, CCMR1, CCMR2 таймера TIM1/TIM8
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: dccharacter - Излить посильно

Сообщение avr123.nm.ru » 22 авг 2012, 14:40

linvinus писал(а): настроен dead-time на 98ns
хотя бы 2000 хорошо.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: dccharacter - Излить посильно

Сообщение dccharacter » 22 авг 2012, 15:55

linvinus писал(а):Ошибки нет, в комплементарном режиме открыт только один транзистор в плече. Ещё настроен dead-time на 98ns
PWM1 это режим выравнивания по краю
PWM2 это режим выравнивания по центру, его я и использую.
для того чтобы работало выравнивание по центру нужно чтобы счётчик читал вверх вниз, за это отвечают биты TIM_CR1_CMS_1 | TIM_CR1_CMS_0 в регистре CR1
PWMD1.tim->CR1 = (TIM_CR1_ARPE | TIM_CR1_URS | TIM_CR1_CMS_1 | TIM_CR1_CMS_0 | TIM_CR1_CEN)
посмотри документацию на регистры CR1, CCMR1, CCMR2 таймера TIM1/TIM8

PWM2 - это не режим выравнивания по центру.
Режим выравнивания устанавливается в тайм-бейс регистрах. Есть ап-каунтинг, даун-каунтинг и центрированный.
А ПВМ1 и ПВМ2 - это один и тот же ПВМ, но для ПВМ1 активный уровень, когда TIM_CNT<TIM_CCR, а в ПВМ2 активный уровень когда TIM_CCR < TIM_CNT < TIM_ARR

Объясни, пожалуйста, что такое комплиментарный режим? Я вот по такой схеме делал: http://www.posterus.sk/?p=2589 (рис 5, коммутационные циклы для U-V-W)

Информация к размышлению:
TIM1 control register 1 (TIMx_CR1) (Reference manual RM0041, стр 248)
Bits 6:5 CMS[1:0]: Center-aligned mode selection
00: Edge-aligned mode. The counter counts up or down depending on the direction bit
(DIR).
01: Center-aligned mode 1. The counter counts up and down alternatively. Output compare
interrupt flags of channels configured in output (CCxS=00 in TIMx_CCMRx register) are set
only when the counter is counting down.
10: Center-aligned mode 2. The counter counts up and down alternatively. Output compare
interrupt flags of channels configured in output (CCxS=00 in TIMx_CCMRx register) are set
only when the counter is counting up.
11: Center-aligned mode 3. The counter counts up and down alternatively. Output compare
interrupt flags of channels configured in output (CCxS=00 in TIMx_CCMRx register) are set
both when the counter is counting up or down.
Note: It is not allowed to switch from edge-

TIM1 capture/compare mode register 1 (TIMx_CCMR1) (Reference manual RM0041, стр 258)
Bits 6:4 OC1M: Output Compare 1 mode
These bits define the behavior of the output reference signal OC1REF from which OC1 and
OC1N are derived. OC1REF is active high whereas OC1 and OC1N active level depends on
CC1P and CC1NP bits.
000: Frozen - The comparison between the output compare register TIMx_CCR1 and the
counter TIMx_CNT has no effect on the outputs.(this mode is used to generate a timing
base).
001: Set channel 1 to active level on match. OC1REF signal is forced high when the counter
TIMx_CNT matches the capture/compare register 1 (TIMx_CCR1).
010: Set channel 1 to inactive level on match. OC1REF signal is forced low when the
counter TIMx_CNT matches the capture/compare register 1 (TIMx_CCR1).
011: Toggle - OC1REF toggles when TIMx_CNT=TIMx_CCR1.
100: Force inactive level - OC1REF is forced low.
101: Force active level - OC1REF is forced high.
110: PWM mode 1 - In upcounting, channel 1 is active as long as TIMx_CNT<TIMx_CCR1
else inactive. In downcounting, channel 1 is inactive (OC1REF=‘0’) as long as
TIMx_CNT>TIMx_CCR1 else active (OC1REF=’1’).
111: PWM mode 2 - In upcounting, channel 1 is inactive as long as TIMx_CNT<TIMx_CCR1
else active. In downcounting, channel 1 is active as long as TIMx_CNT>TIMx_CCR1 else
inactive.
Note: 1: These bits

Добавлено спустя 27 минут 37 секунд:
А, вот нашел про комплиментори: http://cache.freescale.com/files/product/doc/AN1916.pdf
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение linvinus » 22 авг 2012, 16:43

Спасибо что ткнул носом! Смотрел сто раз и не видел. :(
если это то что я думаю то программа должна слегка упроститься.

про комплементарный режим написано в RF
14.3.11 Advanced-control timers (TIM1&TIM8) Complementary outputs and dead-time insertion

моя схема PWM в каждый момент времени один в один соответствует этому http://e2e.ti.com/group/motor/m/files/650512.aspx
эта анимация из статьи http://e2e.ti.com/group/motor/b/blog/ar ... art-5.aspx

хотя бы 2000 хорошо.

я пока не оптимизировал и не просчитывал но 2us это многовато =) у меня транзисторы через драйвер ir4428 управляются
а пока я на 200mA кручу, так что даже К.З. не страшно.
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: dccharacter - Излить посильно

Сообщение linvinus » 23 авг 2012, 00:11

Да PWM2 это то что я как раз искал когда писал шим, но он только инвертирует сигнал но не сдвигает по фазе, ещё нужно сдвинуть по фазе на 180 градусов, я прибил зайцев одним изменением значения CCR1,CCR2,CCR3

Добавлено спустя 23 минуты 42 секунды:
Вот как оно выглядит.
d0,d1 == HA, LA и т.д.
Изображение
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: dccharacter - Излить посильно

Сообщение dccharacter » 23 авг 2012, 00:17

Сдвинуть по фазе можно как раз центрированным каунтингом - получится то же, что у тебя на картинке, только без свистоплясок с CCR1
Но все это фигня. Вот когда дело дойдет то Torque control, вот тогда будет интересно :-)
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Пред.След.

Вернуться в Блоги

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3