Ethernet контроллер для LinuxCNC (STM32, FPGA)
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3101
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Попытался купить с таобао бюджетный STM32H750VBT6, пощупать H7. У трех единственных продавцов еще нет его в наличии. Но объявления уже развесили.
Ещё заметил, что на тао макетка NUCLEO-F767ZI, указанная выше, стоит также как и NUCLEO-H743ZI. При этом на второй установлен H7, который в 2 раза мощнее F7 с первой. Парадокс. Цена за этого зверя довольно приятная - 28$. На Али то же самое - минимум 37$. Загадка.
Желание пощупать H7 всё ещё есть. Попробую взять на тесты уже готовую макетку NUCLEO-H743ZI...
Ещё заметил, что на тао макетка NUCLEO-F767ZI, указанная выше, стоит также как и NUCLEO-H743ZI. При этом на второй установлен H7, который в 2 раза мощнее F7 с первой. Парадокс. Цена за этого зверя довольно приятная - 28$. На Али то же самое - минимум 37$. Загадка.
Желание пощупать H7 всё ещё есть. Попробую взять на тесты уже готовую макетку NUCLEO-H743ZI...
- Argon-11
- Мастер
- Сообщения: 2067
- Зарегистрирован: 07 июн 2017, 17:48
- Репутация: 461
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
На али тусуются полчища ex-ссср-цев с шопоголизмом. Вот хитрые китайцы этим и пользуются, добавляя доп. наценку.MX_Master писал(а):На Али то же самое - минимум 37
Я ранее на али читал отзывы в попытке увидеть истину о товаре и продавце. Но, как выяснилось, если отзыв положительный - он бесполезный. Народ оставляет 4-5 звезд чаще всего сразу после получения, что ничего не говорит о качестве товара. Это следствие шопоголизма и показатель свойств основной аудитории
-
- Новичок
- Сообщения: 35
- Зарегистрирован: 27 фев 2016, 17:03
- Репутация: 7
- Настоящее имя: Сергей
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Проверил возможности STM32F407 (168MHz), на предмет полусофтовой генерации шагов.
Таймер 2MHz, максимальная частота на GPIO 990KHz, jitter ~1mksec.
3 stepgen загрузка процессора ~55%
5 stepgen ---------//---------- ~70%
6 stepgen ---------//---------- ~85%
7 stepgen не успеваю расчитать цикл(1ms)
GPIO любые пины в пределах одного порта.
Таймер 2MHz, максимальная частота на GPIO 990KHz, jitter ~1mksec.
3 stepgen загрузка процессора ~55%
5 stepgen ---------//---------- ~70%
6 stepgen ---------//---------- ~85%
7 stepgen не успеваю расчитать цикл(1ms)
GPIO любые пины в пределах одного порта.
- Argon-11
- Мастер
- Сообщения: 2067
- Зарегистрирован: 07 июн 2017, 17:48
- Репутация: 461
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Как оцениваете загрузку МК? Измеряете время "простоя"?sergx99 писал(а):загрузка процессора ~55%
-
- Новичок
- Сообщения: 35
- Зарегистрирован: 27 фев 2016, 17:03
- Репутация: 7
- Настоящее имя: Сергей
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Примерно да, цикл 1000мкс, на расчет массива уходит 550мкс, проигрывание TIMER - DMA - GPIO->BSRR.Argon-11 писал(а):Как оцениваете загрузку МК? Измеряете время "простоя"?
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3101
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Этот способ, кстати, широко известен. Недавно читал статью. В ней паренёк тестировал новый STM32H7 точно таким же способом (: Массив он, правда, готовил только один раз. А дальше пытался выжать максимум частоты используя разные модули DMA в H7 (DMA, BDMA, MDMA).
Как видно, этот способ упирается только лишь в подготовку массива. Если юзать этот способ и дальше, надо заново изобрести сверх быструю готовку массива для DMA. Текущий способ будет работать чуть быстрее только на H7. Ну и заготовки массивов должны быть рассчитаны заранее.
Как видно, этот способ упирается только лишь в подготовку массива. Если юзать этот способ и дальше, надо заново изобрести сверх быструю готовку массива для DMA. Текущий способ будет работать чуть быстрее только на H7. Ну и заготовки массивов должны быть рассчитаны заранее.
- raddd
- Почётный участник
- Сообщения: 1564
- Зарегистрирован: 10 фев 2015, 08:50
- Репутация: 539
- Настоящее имя: Alexey Rodionov
- Откуда: Беларусь Минский р-н
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Может это http://www.cnc-club.ru/forum/viewtopic. ... 93#p469593 сюда надо было закинуть?
||||||||||||
||||||||||||
||||||||||||
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3101
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Внизу страницы данные по максимальной частоте шагов https://github.com/KevinOConnor/klipper ... eatures.md. Если представить, что мы юзаем не 2-3 оси как в его тесте, а 5 осей + 5 энкодеров и ещё что-то рассчитываем на процессоре, то результаты по частотам будут даже ниже 100 КГц.raddd писал(а):Может это http://www.cnc-club.ru/forum/viewtopic. ... 93#p469593 сюда надо было закинуть?
- raddd
- Почётный участник
- Сообщения: 1564
- Зарегистрирован: 10 фев 2015, 08:50
- Репутация: 539
- Настоящее имя: Alexey Rodionov
- Откуда: Беларусь Минский р-н
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
STM32F103 324K для 3х осей за 1.5$.
Очень неплохо.
Очень неплохо.
||||||||||||
||||||||||||
||||||||||||
- wldev
- Мастер
- Сообщения: 1641
- Зарегистрирован: 24 янв 2012, 16:04
- Репутация: 510
- Настоящее имя: Сергей Бочаров
- Откуда: Новосибирск
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
можно код посмотреть?sergx99 писал(а):Проверил возможности STM32F407 (168MHz), на предмет полусофтовой генерации шагов.
Таймер 2MHz, максимальная частота на GPIO 990KHz, jitter ~1mksec.
3 stepgen загрузка процессора ~55%
5 stepgen ---------//---------- ~70%
6 stepgen ---------//---------- ~85%
7 stepgen не успеваю расчитать цикл(1ms)
GPIO любые пины в пределах одного порта.
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3101
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Алексей, ровно на этом же МК я делал до 1 МГц на 4-х осях (: процессор, грубо говоря, использовался только в сервопериоде, для смены частот. Можно и больше частот сделать, но на одну ось надо будет по два аппаратных таймера.raddd писал(а):STM32F103 324K для 3х осей за 1.5$.
Очень неплохо.
Так что у нас всё схвачено и мы впереди планеты всей. Остается только пожелать Клипперу успехов.
- raddd
- Почётный участник
- Сообщения: 1564
- Зарегистрирован: 10 фев 2015, 08:50
- Репутация: 539
- Настоящее имя: Alexey Rodionov
- Откуда: Беларусь Минский р-н
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Здорово когда шариш!
Я вот только вникаю в это. Только времени с стройкой нет. На работе могу себе позволить немного развиватся в этом направлении.
И то пишу в platformio. Для дешевых СТМок и ЕСПишки.
Я вот только вникаю в это. Только времени с стройкой нет. На работе могу себе позволить немного развиватся в этом направлении.
И то пишу в platformio. Для дешевых СТМок и ЕСПишки.
||||||||||||
||||||||||||
||||||||||||
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3101
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Я, кстати, МК помощней не зря хочу. Планирую всю серво-логику stepgen'ов считать тоже на STM'ке. Драйвер LinuxCNC будет только отправлять/получать данные и забивать их в переменные HAL.
-
- Новичок
- Сообщения: 35
- Зарегистрирован: 27 фев 2016, 17:03
- Репутация: 7
- Настоящее имя: Сергей
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Чуть позже, его немного причесать надо.Bender писал(а):можно код посмотреть?
Eсли расчитывать на максимальную частоту 500KHz то получил не более 60% при 8 stepgen.
Загрузка зависит от генерируемый в текущий момент частоты.
Код: Выделить всё
//таймер stepgen -> загрузка
//2MHz 1x500KHz -> 23%
//2MHz 2x500KHz -> 34%
//2MHz 3x500KHz -> 45%
//2MHz 4x500KHz -> 55%
//2MHz 5x500KHz -> 64%
//2MHz 6x500KHz -> 74%
//2MHz 7x500KHz -> 84%
//2MHz 8x500KHz -> 95%
//2MHz 1x900KHz + 7x100KHz -> 80%
//2MHz 2x900KHz + 6x100KHz -> 86%
//2MHz 3x900KHz + 5x100KHz -> 91%
//1MHz 8x100KHz -> 40%
//1MHz 8x500KHz -> 60%
CORTEX-M7 400MHz + float precision + double precision. ...MX_Master писал(а):Я, кстати, МК помощней не зря хочу ...
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3101
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Как говорят знатоки нашего форума: "а почему нельзя сразу взять самый мощный проц?". И вот, спустя время, я, наконец, понял смысл сего совета - сколько бы чип не стоил, софт будет намного дороже.sergx99 писал(а):CORTEX-M7 400MHz + float precision + double precision. ...
У меня, кстати, вопрос. Вот я вижу, что опорная частота 2 МГц. Как получить при этом точную выходную частоту, скажем, 777 КГц?sergx99 писал(а):Eсли расчитывать на максимальную частоту 500KHz то получил не более 60% при 8 stepgen.
Загрузка зависит от генерируемый в текущий момент частоты.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Думаю PLL (ФАПЧ) тебе поможет...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- selenur
- Почётный участник
- Сообщения: 4604
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1621
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
А ещё написав код на мощном проце куда проще оценить возможность переноса его на более слабый, просто снизив частоту, можно сразу проверить.MX_Master писал(а): Как говорят знатоки нашего форума: "а почему нельзя сразу взять самый мощный проц?". И вот, спустя время, я, наконец, понял смысл сего совета - сколько бы чип не стоил, софт будет намного дороже.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
-
- Новичок
- Сообщения: 35
- Зарегистрирован: 27 фев 2016, 17:03
- Репутация: 7
- Настоящее имя: Сергей
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
В примере выдаю частоты 10 КГц, 11 КГц, 12 КГц, 13 КГц,14 КГц, 105 КГц, 666КГц, 777 КГц, занятость 94%MX_Master писал(а):У меня, кстати, вопрос. Вот я вижу, что опорная частота 2 МГц. Как получить при этом точную выходную частоту, скажем, 777 КГц?
Код: Выделить всё
/*
* cnc_stepgen.cpp
*
* Created on: 25 окт. 2018 г.
* Author: sergx99
*/
#include "stm32f4xx.h"
#include "stm32_dma_f4xx.h"
#include "stm32_tim.h"
#include "hw_conf.h"
/*
Table 94. TIMx Internal trigger connection
Slave TIM ITR0 (TS = 000) ITR1 (TS = 001) ITR2 (TS = 010) ITR3 (TS = 011)
TIM1 TIM5_TRGO TIM2_TRGO TIM3_TRGO TIM4_TRGO
TIM8 TIM1_TRGO TIM2_TRGO TIM4_TRGO TIM5_TRGO
Table 98. TIMx internal trigger connection
Slave TIM ITR0 (TS = 000) ITR1 (TS = 001) ITR2 (TS = 010) ITR3 (TS = 011)
TIM2 TIM1_TRGO TIM8_TRGO TIM3_TRGO TIM4_TRGO
TIM3 TIM1_TRGO TIM2_TRGO TIM5_TRGO TIM4_TRGO
TIM4 TIM1_TRGO TIM2_TRGO TIM3_TRGO TIM8_TRGO
TIM5 TIM2_TRGO TIM3_TRGO TIM4_TRGO TIM8_TRGO
Table 101. TIMx internal trigger connection
Slave TIM ITR0 (TS =’ 000’) ITR1 (TS = ‘001’) ITR2 (TS = ‘010’) ITR3 (TS = ’011’)
TIM9 TIM2_TRGO TIM3_TRGO TIM10_OC TIM11_OC
TIM12 TIM4_TRGO TIM5_TRGO TIM13_OC TIM14_OC
*/
/************************************************/
#define CNC_TIMER_2MHZ
/************************************************/
//STM32TPL https://github.com/antongus/stm32tpl
typedef STM32::DMA::Dma2Channel5 CNC_TxDmaStream;
typedef STM32::TIM::Timer<STM32::TIM::TIM_1> Timer;
#ifdef CNC_TIMER_2MHZ//
#define CNC_BUF_SIZE 2000
#define CNC_TIM_DIV ((168 / 2) - 1)
#endif
#ifdef CNC_TIMER_1MHZ//
#define CNC_BUF_SIZE 1000
#define CNC_TIM_DIV ((168) - 1)
#endif
//определение номера пина порта для stepgen
#define PSET_0 0x00000001UL
#define PSET_1 0x00000002UL
#define PSET_2 0x00000004UL
#define PSET_3 0x00000008UL
#define PSET_4 0x00000010UL
#define PSET_5 0x00000020UL
#define PSET_6 0x00000040UL
#define PSET_7 0x00000080UL
static uint32_t cnc_stepgen_buf[CNC_BUF_SIZE * 2];
static void cnc_dma_buf_clear();
static void timer_init();
static void dma_init();
static void cnc_dma_buf_next(uint32_t *ptr);
void cnc_stepgen_init(){
cnc_dma_buf_clear();
timer_init();
dma_init();
NVIC_EnableIRQ(DMA2_Stream5_IRQn);
}
extern "C" void DMA2_Stream5_IRQHandler(){
if (CNC_TxDmaStream::ISR & CNC_TxDmaStream::DMA_MASK_HTIF){
CNC_TxDmaStream::IFCR = CNC_TxDmaStream::DMA_MASK_HTIF;
cnc_dma_buf_next(cnc_stepgen_buf);
}
if (CNC_TxDmaStream::ISR & CNC_TxDmaStream::DMA_MASK_TCIF){
CNC_TxDmaStream::IFCR = CNC_TxDmaStream::DMA_MASK_TCIF;
cnc_dma_buf_next(&cnc_stepgen_buf[CNC_BUF_SIZE]);
}
}
static void timer_init(){
Timer::EnableClocks();
Timer::TIMx->DIER = TIM_DIER_UDE;
Timer::TIMx->ARR = CNC_TIM_DIV;
Timer::Enable();
}
static void dma_init(){
CNC_TxDmaStream::EnableClocks();
CNC_TxDmaStream::Disable();
CNC_TxDmaStream::FCR &= ~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); // turn off FIFO
CNC_TxDmaStream::CR = 0
| STM32::DMA::DMA_CR_HTIE
| STM32::DMA::DMA_CR_TCIE
| STM32::DMA::DMA_CR_DIR_MEM_TO_PERITH // From memory to peripheral
| STM32::DMA::DMA_CR_CIRC // circular mode
| STM32::DMA::DMA_CR_MINC // Memory increment mode
| STM32::DMA::DMA_CR_MSIZE_32_BIT // Memory size
| STM32::DMA::DMA_CR_PSIZE_32_BIT // Peripheral size
| STM32::DMA::DMA_CR_PRIO_HIGH // priority
| STM32::DMA::DMA_CR_CHSEL_CH6 // select channel (only for F4xx devices)
;
CNC_TxDmaStream::IFCR = CNC_TxDmaStream::DMA_MASK_ALL;
// set memory address and size
CNC_TxDmaStream::PAR = (uint32_t)&GPIOE->BSRRL;
CNC_TxDmaStream::MAR = (uint32_t)cnc_stepgen_buf;
CNC_TxDmaStream::NDTR = CNC_BUF_SIZE * 2;
CNC_TxDmaStream::Enable();
}
static void cnc_dma_buf_clear(){
for(int ii = 0; ii < CNC_BUF_SIZE * 2; ii++){
cnc_stepgen_buf[ii] = 0x00000000;
}
}
#define CNCDIVSHIFT 16
typedef struct{
uint32_t pos;
uint32_t step;
// uint32_t port_dir;
// uint16_t pin_dir;
// uint16_t pin_step;
int m_dir;
// int32_t abs_pos;
}T_CNC_AXIS;
T_CNC_AXIS axis[8];
static uint32_t cnc_dma_buf_item_init(T_CNC_AXIS *l_axis, int16_t puls, uint16_t lenght){
uint32_t rc = 0;
if(puls == 0){
l_axis->step = 0;
l_axis->pos = 0xFFFFFFFF;
}else{
if(puls > 0){
axis->m_dir = 1;
}else{
axis->m_dir = 0;
puls = -puls;
}
l_axis->step = (1 + (lenght << (CNCDIVSHIFT + 1)) / puls) >> 1;
//axis->pos = axis->step / 2;
l_axis->pos = 0;
}
return rc;
}
static inline void cnc_dma_buf_item(uint32_t count, uint32_t &data, int num, const uint32_t pset){
if(count > (axis[num].pos)){
axis[num].pos += axis[num].step;
data = (data & (~(pset << 16))) | pset;
}
}
static void cnc_dma_buf_next(uint32_t *ptr){
uint32_t count;
TE_LED::On();
//тут задаю сколько импульсов выдать за цикл по каждаму каналу
cnc_dma_buf_item_init(&axis[0], 10, CNC_BUF_SIZE);
cnc_dma_buf_item_init(&axis[1], 11, CNC_BUF_SIZE);
cnc_dma_buf_item_init(&axis[2], 12, CNC_BUF_SIZE);
cnc_dma_buf_item_init(&axis[3], 13, CNC_BUF_SIZE);
cnc_dma_buf_item_init(&axis[4], 14, CNC_BUF_SIZE);
cnc_dma_buf_item_init(&axis[5], 105, CNC_BUF_SIZE);
cnc_dma_buf_item_init(&axis[6], 666, CNC_BUF_SIZE);
cnc_dma_buf_item_init(&axis[7], 777, CNC_BUF_SIZE);
for(int ii = 0; ii < CNC_BUF_SIZE; ii++){
ptr[ii] = 0xFFFF0000; //clear only -> 5% 1MHz, 10% 2MHz
count = ii << CNCDIVSHIFT;
cnc_dma_buf_item(count, ptr[ii], 0, PSET_0);
cnc_dma_buf_item(count, ptr[ii], 1, PSET_1);
cnc_dma_buf_item(count, ptr[ii], 2, PSET_2);
cnc_dma_buf_item(count, ptr[ii], 3, PSET_3);
cnc_dma_buf_item(count, ptr[ii], 4, PSET_4);
cnc_dma_buf_item(count, ptr[ii], 5, PSET_5);
cnc_dma_buf_item(count, ptr[ii], 6, PSET_6);
cnc_dma_buf_item(count, ptr[ii], 7, PSET_7);
//2MHz 1x500KHz -> 23%
//2MHz 2x500KHz -> 34%
//2MHz 3x500KHz -> 45%
//2MHz 4x500KHz -> 55%
//2MHz 5x500KHz -> 64%
//2MHz 6x500KHz -> 74%
//2MHz 7x500KHz -> 84%
//2MHz 8x500KHz -> 95%
//2MHz 1x900KHz 7x100KHz -> 80%
//2MHz 2x900KHz 6x100KHz -> 86%
//2MHz 3x900KHz 5x100KHz -> 91%
//1MHz 8x10KHz -> 35%
//1MHz 8x100KHz -> 40%
//1MHz 8x500KHz -> 60%
}
TE_LED::Off();
}
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3101
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Как вариант - неплохо.
Но 2 тыщи циклов с кодом за сервопериод - это жесть. Отправка/получение данных по сети, энкодеры, ШИМки и прочий код можно удобно разместить в соседнем МК
Но 2 тыщи циклов с кодом за сервопериод - это жесть. Отправка/получение данных по сети, энкодеры, ШИМки и прочий код можно удобно разместить в соседнем МК
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3101
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Плата развязки для LinuxCNC (Ethernet + STM32)
Вспомнилось, кто-то хотел крепить плату развязки на DIN рейку. Есть вот такой простой и недорогой вариант
https://www.aliexpress.com/item/-/32825286219.html
https://www.aliexpress.com/item/-/32834853066.html
https://www.aliexpress.com/item/-/32624080359.html
https://www.aliexpress.com/item/-/32825286219.html
https://www.aliexpress.com/item/-/32834853066.html
https://www.aliexpress.com/item/-/32624080359.html