PDA

View Full Version : [Hỏi]: làm thế nào để code STM32F4 đếm xung step và direction?



ghoang
02-07-2016, 10:49:40 AM
Hi all
Em đang diy ac servo driver sử dụng STM32F4 làm vi xử lí trung tâm nhận step dir&encoder và giao tiếp với STM32F1 để phát PWM cho cầu H, hiện tại em đang dùng ngắt ngoài để nhân step dir nhưng không thành công, cứ có ngắt từ step dir là F4 và F1 không truyền dữ liệu cho nhau được
Giờ em muốn đếm step dir bằng hardware trên F4 sử dụng timer ở chế độ encoder mode 1, mong anh em ai làm qua cái này cho em chút ý kiến tham khảo
Thank in advance

Gamo
02-07-2016, 11:06:49 AM
1. Protocol truyền dữ liệu giữa 2 con bác dùng là gì?
2. Tại sao phải dùng 2 con MCU chi cho mất công vậy? Mình dùng STM32F1 cho servo driver thấy nó đã overkill rồi
3. Bác dùng chân gì để nhận step/dir & chân gì để truyền dữ liệu?

Sử dụng timer để nhận step/dir cũng được nhưng phí thời gian xử lý & chưa chắc chính xác

nhatson
02-07-2016, 11:09:18 AM
cho em hỏi là tại sao phải truyền dữ liệu từ F4 sang F1 nhỉ?

duonghoang
02-07-2016, 01:00:38 PM
--- Em nghĩ step dir bác phải dùng Interrupts mới xử lý được chứ, bác update giá trị step dir vào các thanh ghi timer nó nhận giá trị nhưng ko xử lý trực tiếp luôn được nên có thể gây chậm trễ quá trình xử lý. Em có mấy cái link sử dụng encoder mode bác xem thử:

http://www.micromouseonline.com/2013/02/16/quadrature-encoders-with-the-stm32f4/
http://aimagin.com/blog/using-timercounter/

ghoang
02-07-2016, 03:14:19 PM
1. Protocol truyền dữ liệu giữa 2 con bác dùng là gì?
2. Tại sao phải dùng 2 con MCU chi cho mất công vậy? Mình dùng STM32F1 cho servo driver thấy nó đã overkill rồi
3. Bác dùng chân gì để nhận step/dir & chân gì để truyền dữ liệu?

Sử dụng timer để nhận step/dir cũng được nhưng phí thời gian xử lý & chưa chắc chính xác

1. Dùng UART ah
2. Đếm encoder 17 bit nên cần con mạnh ah
3. Step là PA8 còn dir là PA9, UART là PA2 va PA3
Em muốn đếm bằng encoder mode không phải timer ah, đọc manual con STM32 thi đúng là có thể đếm step dir nhưng thực tế lại khác, có lẽ tài liệu có bug

22014

Dự án này em chỉ sửa lại code thôi a
Cho thêm cái clip, đang trong quá trình ngâm cứu nên hơi chuối


https://www.youtube.com/watch?v=my5OyFE8fwo

ghoang
02-07-2016, 03:18:18 PM
cho em hỏi là tại sao phải truyền dữ liệu từ F4 sang F1 nhỉ?

Để cách lí phần điêu khiển và công suất ah

ghoang
02-07-2016, 03:24:41 PM
--- Em nghĩ step dir bác phải dùng Interrupts mới xử lý được chứ, bác update giá trị step dir vào các thanh ghi timer nó nhận giá trị nhưng ko xử lý trực tiếp luôn được nên có thể gây chậm trễ quá trình xử lý. Em có mấy cái link sử dụng encoder mode bác xem thử:

http://www.micromouseonline.com/2013/02/16/quadrature-encoders-with-the-stm32f4/
http://aimagin.com/blog/using-timercounter/

interrupt theo em biết nếu nhịp xung trên 1M trong ứng dụng này là sai tè le rồi a
cảm ơn bác em sẽ xem link bác gửi xem có ý tưởng mới không

Gamo
02-07-2016, 03:25:39 PM
Ủa, con encoder 17 bit của bác là loại gì? ABZ hay protocol riêng của hãng?

Mình làm driver DC Servo cách đây lâu rồi, bằng STM32F1xx
1. Về cách ly thì mình e là bạn cách ly điều khiển/công suất bằng cách dùng 2 con MCU khác nhau nối qua UART thì ko ăn thua đâu mà nó lại rối rắm cuộc đời ra. Mình thì hay dùng cách ly quang. Ko biết lão sư phọ Nhật Sơn cụ Dương Hoàng thì dùng pp gì?
2. Step/Dir của bạn ko thể nào đạt tới 1Mhz được, do đó bạn ko phải lo việc sai tè le :D
3. Bạn kiểm tra lại PA8 và PA9 có dùng chung timer với PA2 & PA3 hay ko? Nếu dùng chung timer thì đó là nguyên nhân bạn bị lỗi
4. Ngoài ra khi có xung step/dir thì nguồn điện của MCU có ổn định ko? UART đang truyền với tốc độ bao nhiêu?

ghoang
02-07-2016, 03:30:21 PM
Ủa, con encoder 17 bit của bác là loại gì? ABZ hay protocol riêng của hãng?

Mình làm driver DC Servo cách đây lâu rồi, bằng STM32F1xx
1. Còn về cách ly thì mình e là bạn cách ly điều khiển/công suất bằng cách dùng 2 con MCU khác nhau thì ko ăn thua đâu mà nó lại rối rắm cuộc đời ra. Mình thì hay dùng cách ly quang. Ko biết lão sư phọ Nhật Sơn cụ Dương Hoàng thì dùng pp gì?
2. Step/Dir của bạn ko thể nào đạt tới 1Mhz được, do đó bạn ko phải lo việc sai tè le
3. Bạn truyền UART thì cũng khó ổn định với 1Mhz được, do đó step/dir mà có 1Mhz thì truyền qua UART cũng trễ như thường

Read more: http://forum.cncprovn.com/threads/8310-Hoi-lam-the-nao-de-code-STM32F4-dem-xung-step-va-direction#ixzz4DEq1lFhI


Có lẽ em cần xem lại cách xử lí ngắt xem thế nào, em đã có câu trả lơi từ chuyên gia la không xài encoder mode được
trong clip là con yaskawa sigma2 1.5kw đó ah đang chạy 100VDC nên cấp xung nhanh là error, để kiếm cái nguồn DC 200V thử lại
UART thực tế đang là 2M và em chưa thấy vấn đề gi ah

Gamo
02-07-2016, 03:37:06 PM
Ừa, mình quên, hôm trước test UART 5Mhz mới bị giới hạn chứ 2Mhz vẫn còn ok.

Encoder của con Yaskawa là loại gì? ABZ hay protocol riêng của hãng?

ghoang
02-07-2016, 03:39:30 PM
Serial RS-422 bác gamo ah

Gamo
02-07-2016, 03:41:34 PM
À hehe, thế thì phải 2 con MCU là đúng ùi. Nếu ABZ thì chỉ cần STM32F1xx là đủ

Mình tò mò chút, thế đoạn code giải mã protocol của Yaskawa ở đâu vậy bác?

duonghoang
02-07-2016, 03:45:24 PM
--- Trong phần Interrupts thường em viết ngắn nhất có thể, thời gian thực thi các dòng lệnh trong đó có thể tính toán sơ qua được xem nó có ảnh hưởng lớn đến các yếu tố khác ko.
--- Mấy vụ này em cũng khoái lắm mà phần công suất làm chưa được tốt nên chưa thử lại, cháy nổ hoài sợ quá roài :p

Gamo
02-07-2016, 03:56:28 PM
Hồi đó bác thường bị cháy nổ là do sao vậy?

ghoang
02-07-2016, 04:07:26 PM
--- Trong phần Interrupts thường em viết ngắn nhất có thể, thời gian thực thi các dòng lệnh trong đó có thể tính toán sơ qua được xem nó có ảnh hưởng lớn đến các yếu tố khác ko.
--- Mấy vụ này em cũng khoái lắm mà phần công suất làm chưa được tốt nên chưa thử lại, cháy nổ hoài sợ quá roài :p

Em chỉ code đơn giản thế này mà vẫn đang có vấn đề

void EXTI9_5_IRQHandler(void)
{

if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == 1)
count1 += 1;
else
count1 -= 1;

EXTI_ClearITPendingBit(EXTI_Line12);
}

Gamo
02-07-2016, 04:17:24 PM
À, bác đang dùng đoạn code của mcm_xyz phải ko?

duonghoang
02-07-2016, 04:20:12 PM
Hồi đó bác thường bị cháy nổ là do sao vậy?

--- Đợt em làm ko thêm mấy con logic nên hay bị trùng dẫn cầu H, cháy fet, với lại phần đệm cho fet ko được tốt lắm có fet dẫn ko bão hòa nên nóng nhiều.

nhatson
02-07-2016, 04:29:59 PM
--- Đợt em làm ko thêm mấy con logic nên hay bị trùng dẫn cầu H, cháy fet, với lại phần đệm cho fet ko được tốt lắm có fet dẫn ko bão hòa nên nóng nhiều.

pwm của stm32 cho phép deadtime mà ta?

ghoang
02-07-2016, 04:36:36 PM
À, bác đang dùng đoạn code của mcm_xyz phải ko?

Là sao bác em cấu hình EXTI theo cái này

http://stm32f4-discovery.net/2014/08/stm32f4-external-interrupts-tutorial/

nhatson
02-07-2016, 05:05:14 PM
nếu đơn giản là cách ly sao ko dùng opto tốc độ cao, đo dòng dùng hall sensor hoặc linear optocloup ah?
cập nhật thanh ghi PWM nhanh hơn truyền cái data đó xuống con slave

ghoang
02-07-2016, 05:41:33 PM
nếu đơn giản là cách ly sao ko dùng opto tốc độ cao, đo dòng dùng hall sensor hoặc linear optocloup ah?
cập nhật thanh ghi PWM nhanh hơn truyền cái data đó xuống con slave

1 con sẽ không đủ in out và adc cho pwm, display,encoder interface, voltage protect, current protect, uart for tuning, brake, fan, hal sensor vv

nhatson
02-07-2016, 06:17:10 PM
1 con sẽ không đủ in out và adc cho pwm, display,encoder interface, voltage protect, current protect, uart for tuning, brake, fan, hal sensor vv

144pin mà ko đủ là sao ta
màn hình cho SPI hoặc serial đi ah, cái này ko cần real time lắm
10 analog
10pwm
10 IO

duonghoang
02-07-2016, 07:55:02 PM
pwm của stm32 cho phép deadtime mà ta?

--- Hồi xưa em xài avr, mà deadtime stm32 em cũng chưa rõ :). THôi từ từ tính tiếp cụ, phải kiếm cơm bỏ bụng đã, số khổ @@

ghoang
02-07-2016, 07:58:58 PM
144pin mà ko đủ là sao ta
màn hình cho SPI hoặc serial đi ah, cái này ko cần real time lắm
10 analog
10pwm
10 IO

Multi-functionality mà bác :d

ghoang
07-07-2016, 12:28:29 PM
Thêm cái clip test step/dir với HC-SFS102 (chỉ có step ko có dir vì lười cắm máy tính, tận dụng cái encoder lun)


https://www.youtube.com/watch?v=Rb2PDZBod-U