本帖最后由 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;
}
}
}
|
|