打印
[技术问答]

nuc120与英威腾伺服SV-DA100通讯问题

[复制链接]
2012|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eyancool|  楼主 | 2014-4-22 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 eyancool 于 2014-4-22 09:52 编辑

用51与英威腾新款伺服SV-DA100采用485通讯能够控制伺服转速,改用NUC120后弄了很久,始终无**常通讯.求九哥和版主以及各位大神给予帮助.
连接方式说明:
开发板为网购,与菜农开发板一致.
UART1连接伺服通讯口,GPB14,15采用外部中断,GPB14触发一次速度加10,发送标志位置1将数据从UART1发送至伺服驱动器,GPB15触发一次速度减10,发送标志位置1将数据从UART1发送至伺服驱动器,根据伺服使用说明手册,使用0x10功能码对伺服内部地址进行写数据.
伺服参数设置如下:
波特9600,8位数据,1位停止,无校验.
工程用COIDE建立,附件1为源代码,附件2为英威腾SV-DA100使用说明手册. nuc120toinvtservo.zip (199.77 KB)
/*************************************************************
* @file      : Init.c
* @brief     : Peripheral Init Functions
* @version   : 1.2.4
* @date      : 04/21/2014  18:56
* @author    : Created by CoSmart 1.2.4
**************************************************************/
#include "NUC1xx.h"
#include "DrvSYS.h"
#include "DrvGPIO.h"
#include "DrvUART.h"
#define send485() DrvGPIO_SetBit(E_GPA, 5);//485发数据
#define rev485()  DrvGPIO_ClrBit(E_GPA, 5);//485接收数据
/*变量         从机地址   功能码         地址高位        地址低位    地址个数高位       地址个数低位      字节数*/
int16_t Addr,Function,Highadd,Lowadd,Highnumber,Lownumber,Bitnumber,
/*数据高位     数据低位     第二个数据高位   第二个数据低*/
Highdate,Lowdate,Twohigh,Twolow;
/*全局速度变量*/
int16_t Speed;
/*数据发送标志位*/
uint8_t Sendbit;
/*数据发送数组      数据接收数组*/
uint8_t senddate[13],revdate[13];
/*************************************************************
* SYS Initialization Code Template
**************************************************************/
void SYSCtl_Init()
{

    /* Unlock protected registers */
    DrvSYS_UnlockProtectedReg();

    /* Select the osc clock source */
    DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);

    /* Select the osc clock source */
    DrvSYS_SetOscCtrl(E_SYS_XTL32K, 1);

    /* Select the HCLK source */
    DrvSYS_SelectHCLKSource(0);

    /* Set the  HCLK clock divider */
    DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0);

    /* Select the clock source */
    DrvSYS_SelectSysTickSource(0);

    DrvSYS_LockProtectedReg();
}

/***************************************************************************//**
* Declare function prototype
*******************************************************************************/
void pfEINT0Callback(void);
void pfEINT1Callback(void);

/*************************************************************
* GPIOB Initialization
**************************************************************/
void GPIOB_Init()
{
   //
   // Config GPIO Pin as EINT0 function
   //
   DrvGPIO_InitFunction(E_FUNC_EXTINT0);
   //
   // Config GPIO Pin as EINT1 function
   //
   DrvGPIO_InitFunction(E_FUNC_EXTINT1);

   //
   // Enable EINT0 and Set Call back
   //
   DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, pfEINT0Callback);
   //
   // Enable EINT1 and Set Call back
   //
   DrvGPIO_EnableEINT1(E_IO_FALLING, E_MODE_EDGE, pfEINT1Callback);
}

/* External Interrupt 0 CallBack function */
void pfEINT0Callback(void)
{
    //add your code
        DrvSYS_Delay(20000);
        if(!DrvGPIO_GetBit(E_GPB,14))
        {
                DrvGPIO_ClrBit(E_GPA, 2);
                Speed=Speed+10;
                _DRVUART_SENDBYTE(UART_PORT0,Speed);
                Sendbit=1;
        }
}

/* External Interrupt 1 CallBack function */
void pfEINT1Callback(void)
{
        int16_t Lossdate;
    //add your code
        DrvSYS_Delay(20000);
                if(!DrvGPIO_GetBit(E_GPB,15))
                {
                        DrvGPIO_ClrBit(E_GPA, 2);
                        Speed=Speed-10;
                        if(Speed<0)
                        {
                                Lossdate=(~Speed)+1;
                                _DRVUART_SENDBYTE(UART_PORT0,Lossdate);
                        }
                        if(Speed>=0)
                        {
                        _DRVUART_SENDBYTE(UART_PORT0,Speed);
                        }
                        Sendbit=1;
                }
}

/*************************************************************
* GPIOA Initialization
**************************************************************/
void GPIOA_Init()
{
   //
   // Set PA2 Pin Mode
   //
   DrvGPIO_Open(E_GPA, 2, E_IO_OUTPUT);
   //
   // Set PA3 Pin Mode
   //
   DrvGPIO_Open(E_GPA, 3, E_IO_OUTPUT);
   //
   // Set PA4 Pin Mode
   //
   DrvGPIO_Open(E_GPA, 4, E_IO_OUTPUT);
   //
   // Set PA5 Pin Mode
   //
   DrvGPIO_Open(E_GPA, 5, E_IO_OUTPUT);
   //
   // Set PA7 Pin Mode
   //
   DrvGPIO_Open(E_GPA, 7, E_IO_OUTPUT);

}

/* Uart CallBack function */
void UART1_Callback(uint32_t);

/*************************************************************
* UART1 Initialization
**************************************************************/
void UART1_Init()
{
    STR_UART_T UartParam;
   // E_DRVGPIO_FUNC FuncNum = E_FUNC_UART1;
    E_UART_PORT UartNum = UART_PORT1;

    /* Uart Pin Config */
    DrvGPIO_InitFunction(E_FUNC_UART1);

    /* Uart Config */
    UartParam.u32BaudRate = 9600;
    UartParam.u8cDataBits = DRVUART_DATABITS_8;
    UartParam.u8cStopBits = DRVUART_STOPBITS_1;
    UartParam.u8cParity = DRVUART_PARITY_NONE;
    UartParam.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES;
    UartParam.u8TimeOut = 0;
    /* Uart Open */
    DrvUART_Open(UartNum, &UartParam);
    /* Enable the Uart function */
    DrvUART_EnableInt(UartNum, DRVUART_RDAINT, UART1_Callback);


}

/**
* Uart CallBack function
*/
void UART1_Callback(uint32_t u32IntStatus)
{
    /* Add your code here */
        uint8_t revchar;
        if(u32IntStatus&DRVUART_RDAINT)
        {
                DrvGPIO_ClrBit(E_GPA, 3);
                while(UART0->ISR.RDA_IF==1)
                {
                        //DrvUART_Read(UART_PORT1,revchar,1);
                        revchar=_DRVUART_RECEIVEBYTE(UART_PORT1);
                        _DRVUART_SENDBYTE(UART_PORT0,revchar);
                }
        }

}

/* Uart CallBack function */
void UART0_Callback(uint32_t);

/*************************************************************
* UART0 Initialization
**************************************************************/
void UART0_Init()
{
    STR_UART_T UartParam;
   // E_DRVGPIO_FUNC FuncNum = E_FUNC_UART0;
    E_UART_PORT UartNum = UART_PORT0;

    /* Uart Pin Config */
    DrvGPIO_InitFunction(E_FUNC_UART0);

    /* Uart Config */
    UartParam.u32BaudRate = 115200;
    UartParam.u8cDataBits = DRVUART_DATABITS_8;
    UartParam.u8cStopBits = DRVUART_STOPBITS_1;
    UartParam.u8cParity = DRVUART_PARITY_NONE;
    UartParam.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES;
    UartParam.u8TimeOut = 0;
    /* Uart Open */
    DrvUART_Open(UartNum, &UartParam);
    /* Enable the Uart function */
    DrvUART_EnableInt(UartNum, DRVUART_RDAINT, UART0_Callback);


}

/**
* Uart CallBack function
*/
void UART0_Callback(uint32_t u32IntStatus)
{
    /* Add your code here */
}

void Init()
{
    SYSCtl_Init();
    GPIOB_Init();
    GPIOA_Init();
    UART1_Init();
    UART0_Init();
}
int main(void)
{
    Init();
    while(1)
    {
            if(Sendbit==1)
            {
                    Addr=0x02;
                    senddate[0]=Addr;
                    Function=0x10;
                    senddate[1]=Function;
                    Highadd=1826/256;
                    Lowadd=1826%256;
                    senddate[2]=Highadd;
                    senddate[3]=Lowadd;
                    Highnumber=0x00;
                    Lownumber=0x02;
                    senddate[4]=Highnumber;
                    senddate[5]=Lownumber;
                    Bitnumber=0x04;
                    senddate[6]=Bitnumber;
                    Highdate=(Speed&0xff00)>>8;
                    Lowdate=Speed&0x00ff;
                    senddate[7]=Highdate;
                    senddate[8]=Lowdate;
                    Twohigh=0x00;
                    Twolow=0x00;
                    senddate[9]=Twohigh;
                    senddate[10]=Twolow;
                    rev485();
                    DrvSYS_Delay(40);
                    send485();
                    //DrvSYS_Delay(30000);
                    DrvUART_Write(UART_PORT1,senddate,13);
                    DrvUART_Write(UART_PORT0,senddate,13);
                    DrvSYS_Delay(700);
                    rev485();
                    Sendbit=0;
            }
    }
}

沙发
骗子的片子| | 2014-4-22 15:29 | 只看该作者
因为是手机上的,无法打开压缩包,先帮你顶一下

使用特权

评论回复
板凳
haolaishi| | 2014-4-22 21:37 | 只看该作者
没硬件,看不出什么东西来,楼主还是单步调试吧
1.你确定485正常通讯?
2.然后考虑电机问题

使用特权

评论回复
地板
niuyaliang| | 2014-4-23 17:11 | 只看该作者
你这程序也太多了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

106

帖子

4

粉丝