AX58100 IN OUT PINES

More
06 Dec 2024 20:53 #316136 by COFHAL
Replied by COFHAL on topic AX58100 DAC
The DAC also works by placing values ​​between 0 and 1020 volts, which gives values ​​between 0 and 3.28 volts at the output. It could be used directly to control the speed of a VFD by scaling it.

Please Log in or Create an account to join the conversation.

More
06 Dec 2024 21:19 - 06 Dec 2024 21:22 #316137 by Hakan
Replied by Hakan on topic AX58100 IN OUT PINES
You can (or should be able to, is best to say) select your own datatypes.
Starting in eeprom_generator. Then for lcec in ethercat-conf.xml you can select the datatype of the created hal pin.
I don't think every combination is possible or makes sense, but to go from ethercat u32 to hal bit should work. For example.

Regarding the Analog voltage output - yes that was the reason to chose that pin - it is DAC capable.
The STM32 is really picky which pin one selects, they all have special functions and are not interchangeable at all.
Last edit: 06 Dec 2024 21:22 by Hakan.
The following user(s) said Thank You: COFHAL

Please Log in or Create an account to join the conversation.

More
07 Dec 2024 04:17 #316157 by SOLD
Replied by SOLD on topic AX58100 IN OUT PINES

I have been playing with the inputs and outputs of the card and I realized that these are of type u32 and in order to be used in LCN they must be converted to BITs with the conv_u32_bit component, this is because some pins that LCN automatically creates are of type bit, such as joint.N.amp-fault.in, iocontrol.o.emc.enable-in, or any other pin that has been declared as type bit.

This problem is fixed directly in ethercat-conf.xml using the original eeprom.
<pdo idx="1a01">
<pdoEntry idx="6001" subIdx="01" bitLen="1" halPin="in1" halType="bit"/>
<pdoEntry idx="6001" subIdx="02" bitLen="1" halPin="in2" halType="bit"/>
<pdoEntry idx="6001" subIdx="03" bitLen="1" halPin="in3" halType="bit"/>
<pdoEntry idx="6001" subIdx="04" bitLen="1" halPin="in4" halType="bit"/>
<pdoEntry idx="6001" subIdx="05" bitLen="1" halPin="in5" halType="bit"/>
<pdoEntry idx="6001" subIdx="06" bitLen="1" halPin="in6" halType="bit"/>
<pdoEntry idx="6001" subIdx="07" bitLen="1" halPin="in7" halType="bit"/>
<pdoEntry idx="6001" subIdx="08" bitLen="1" halPin="in8" halType="bit"/>
</pdo>
 
The following user(s) said Thank You: COFHAL

Please Log in or Create an account to join the conversation.

More
07 Dec 2024 05:24 #316158 by SOLD
Replied by SOLD on topic AX58100

ฮาคานโพสต์=316122 userid=22448ขอแสดงความยินดีด้วย โปรแกรมดีบักเกอร์ช่วยได้มากในการแก้ปัญหาบางอย่าง
ดังที่คุณทราบ ตัวแปรจะอัปเดตเมื่อโปรแกรมหยุดชั่วคราวหรือกำลังดำเนินการ

Thanks for the guide.

Next step, I might change the name of pin in u32 index-status; in metalmusings_encoder.comp to match the name of pdo, as I have confused it, and might need to change the data type of one of the parts to match.

Then reconnect the hal.

As I understand it,
when "Obj.IndexStatus" is sent to "pin in u32 index-status" in metalmusings_encoder,
it causes "pin io bit index-c-enable", which is equivalent to the original index-enable, to change the state to 1.
When index-c-enable is triggered, "pin out u32 index-latch-enable" will return to "Obj.IndexLatchEnable" to reset encCnt to 0, waiting to be 1 in the next round.

Please Log in or Create an account to join the conversation.

More
07 Dec 2024 06:08 #316159 by SOLD
Replied by SOLD on topic AX58100
I have an idea to add M19 function inside STM32 so that it can manage the Orientation process by itself, receiving M19 command or just 1 button from lcnc.

I tried to let Ai create a sample code according to my needs. It came out as follows. Of course, it still doesn't work. And the Obj variable that can't handle it. I don't have the knowledge to create a new program.
#include "OrientationHandler.h"
#include <Arduino.h>
#include "MyEncoder.h"

extern HardwareSerial Serial1;
extern MyEncoder Encoder1;
extern double spindleTargetPos;  // ตัวแปรใหม่ที่ใช้เก็บตำแหน่งเป้าหมายสำหรับสปินเดิล
extern const byte DAC1_pin;      // ขาสำหรับเชื่อมต่อสัญญาณอนาล็อก (0-10V)
extern _Objects Obj;

// ฟังก์ชันคำนวณทิศทางที่สั้นที่สุดในการหมุน
int calculateShortestAngle(int currentAngle, int targetAngle)
{
    // ทำให้มุมทั้งหมดอยู่ในช่วง 0-360 องศา
    currentAngle = currentAngle % 360;
    targetAngle = targetAngle % 360;
    
    // คำนวณความแตกต่างระหว่างมุม
    int deltaAngle = targetAngle - currentAngle;
    
    // ถ้าความแตกต่างมากกว่า 180 องศา ให้เลือกหมุนทางที่สั้นที่สุด
    if (deltaAngle > 180)
        deltaAngle -= 360;
    else if (deltaAngle < -180)
        deltaAngle += 360;

    return deltaAngle;  // ผลลัพธ์เป็นมุมที่ใกล้ที่สุดในการหมุน
}

// ฟังก์ชันสำหรับการหมุนสปินเดิลไปยังมุมที่กำหนด
void spindleOrientation(int targetAngle)
{
    Serial1.println("คำสั่ง M19 ได้รับแล้ว กำลังหมุนสปินเดิลไปยังมุมเป้าหมาย...");
    
    int currentAngle = Encoder1.currentPos();  // อ่านมุมปัจจุบันของสปินเดิล
    int deltaAngle = calculateShortestAngle(currentAngle, targetAngle);  // คำนวณมุมที่ใกล้ที่สุดที่ควรหมุน

    Serial1.print("มุมที่ใกล้ที่สุด: ");
    Serial1.println(deltaAngle);

    // ถ้ามุมที่ต้องการคือ 0 หรือใกล้เคียง (ไม่ต้องหมุน)
    if (fabs(deltaAngle) <= 0.01)
    {
        Serial1.println("ตำแหน่งปัจจุบันตรงกับตำแหน่งที่ต้องการ ไม่ต้องหมุน");
        analogWrite(DAC1_pin, 0);  // หยุดการหมุน
        Obj.SpindleStatus = 1;  // หมายเลข 1 สำหรับสำเร็จ
        return;  // ออกจากฟังก์ชัน
    }

    // คำนวณค่าอนาล็อกเพื่อควบคุมแรงดัน 0-10V (ใช้ map แปลงจากมุมที่ต้องหมุนเป็นค่าที่ใช้กับ analogWrite)
    int analogValue = map(abs(deltaAngle), 0, 360, 0, 255);
    if (analogValue > 255) analogValue = 255; // ตรวจสอบให้ค่าไม่เกิน 255

    // กำหนดทิศทางการหมุนและควบคุมมอเตอร์
    if (deltaAngle > 0)  // หมุนไปทางขวา (clockwise)
    {
        analogWrite(DAC1_pin, analogValue);
        Serial1.println("หมุนไปทางขวา (clockwise)");
    }
    else if (deltaAngle < 0)  // หมุนไปทางซ้าย (counterclockwise)
    {
        analogWrite(DAC1_pin, analogValue);
        Serial1.println("หมุนไปทางซ้าย (counterclockwise)");
    }
    
    // ตั้งเวลาหมุนสูงสุด (timeout) เช่น 5 วินาที
    unsigned long startTime = millis();
    unsigned long timeout = 5000;  // เวลา 5 วินาที

    // รอจนกว่าสปินเดิลจะถึงตำแหน่งเป้าหมาย หรือจนถึงเวลาหมด
    while (fabs(Encoder1.currentPos() - targetAngle) > 0.01)
    {
        // ตรวจจับ rising edge ของสัญญาณ encoder index pulse เพื่อยืนยันการหมุนถึงตำแหน่งศูนย์
        if (Encoder1.indexHappened())
        {
            Serial1.println("ตรวจจับ index pulse แล้ว.");
        }

        // ลดความเร็วเมื่อเข้าใกล้ตำแหน่งเป้าหมาย
        if (fabs(Encoder1.currentPos() - targetAngle) < 5.0)
        {
            Serial1.println("ใกล้ถึงตำแหน่งเป้าหมาย ลดความเร็วลง...");
            analogValue = map(abs(deltaAngle), 0, 360, 0, 100); // ลดค่าควบคุมแรงดันเพื่อหมุนช้าลง
            analogWrite(DAC1_pin, analogValue);
        }

        // อัพเดตการทำงานของมอเตอร์
        updateStepperGenerators();

        // ตรวจสอบเวลา timeout
        if (millis() - startTime > timeout)
        {
            Serial1.println("เวลาหมุนหมดแล้ว, ไม่สามารถหาตำแหน่งได้!");
            analogWrite(DAC1_pin, 0);  // หยุดการหมุน

            // ส่งสถานะกลับไปยัง Master ว่าการหมุนไม่สำเร็จ
            Obj.SpindleStatus = 2;  // หมายเลข 2 สำหรับ Timeout
            return;  // ออกจากฟังก์ชัน
        }
    }

    // เมื่อถึงตำแหน่งเป้าหมาย, หยุดจ่ายไฟ (หรือปรับค่าผลลัพธ์เป็น 0)
    analogWrite(DAC1_pin, 0);  // หยุดการหมุนโดยการส่งค่าแรงดัน 0

    // ส่งสถานะกลับไปยัง Master ว่าการหมุนสำเร็จ
    Obj.SpindleStatus = 1;  // หมายเลข 1 สำหรับสำเร็จ

    Serial1.println("สปินเดิลได้ถูกออเรียนเทชันไปยังมุมที่กำหนดแล้ว.");
}

Functions to be included
- Use DAC1 as analog +-10V to control servo spindle
- Receive M19 command and degree variables such as R0 R45 R90 from Hal " net spindle_orientation => ecat.0.command "
- Check if the current position is the same as the desired target
- Calculate the nearest rotation direction
- Add edge, near function
- Timer to turn off DAC if no target is found
- Confirm operation or error back to Master
Other if necessary

Please Log in or Create an account to join the conversation.

More
07 Dec 2024 13:23 #316188 by COFHAL
Replied by COFHAL on topic AX58100 IN OUT PINES
yes, work.

Please Log in or Create an account to join the conversation.

More
07 Dec 2024 14:24 #316192 by SOLD
Replied by SOLD on topic AX58100 IN OUT PINES

yes, work.

???

Please Log in or Create an account to join the conversation.

More
07 Dec 2024 19:46 - 07 Dec 2024 19:48 #316210 by COFHAL
Replied by COFHAL on topic AX58100 IN OUT PINES
  This work :This problem is fixed directly in ethercat-conf.xml using the original eeprom.
Last edit: 07 Dec 2024 19:48 by COFHAL.
The following user(s) said Thank You: SOLD

Please Log in or Create an account to join the conversation.

More
14 Dec 2024 16:00 #316655 by COFHAL
Replied by COFHAL on topic Commun pin drivers
I have a question about how to connect the STEP DIR motor control outputs. Since they are not differential, one of the input pins on the driver is common. Which is common, the negative or the positive of each driver input?

Please Log in or Create an account to join the conversation.

More
14 Dec 2024 17:53 #316660 by Hakan
Replied by Hakan on topic Commun pin drivers
This is the Kicad schematics
 

and the Kicad layout of the connector on the board
 

Common is negative, GND.
Attachments:
The following user(s) said Thank You: COFHAL

Please Log in or Create an account to join the conversation.

Time to create page: 0.218 seconds
Powered by Kunena Forum