极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20084|回复: 2

最近用iar编写dynamixel舵机不知是硬件出还是软件问题

[复制链接]
发表于 2016-11-27 14:53:01 | 显示全部楼层 |阅读模式

#include "timer.h"
#include "usart.h"

extern ptl_stack tx_stack;
extern ptr_stack rx_stack;
int main(void)
{
    SystemInit();                //初始化系统,使得系统频率为72M
    systick_init();              //配置Systick,使得1ms产生中断
    usart_config();              //配置usart
    tx_stack_init();             //初始化发送缓冲区
    rx_stack_init();             //初始化接收缓冲区
   
    delay_ms(10);
   
    /*待传输数据*/
    tx_stack.data[0] = 0xFF;  
    tx_stack.data[1] = 0xFF;      
    tx_stack.data[2] = 0xFE;      
    tx_stack.data[3] = 0x09;      
    tx_stack.data[4] = 0x83;      
    tx_stack.data[5] = 0x1E;      
    tx_stack.data[6] = 0x04;      
    tx_stack.data[7] = 0x00;      
    tx_stack.data[8] = 0x10;      
    tx_stack.data[9] = 0x00;      
    tx_stack.data[10] = 0x50;        
    tx_stack.data[11] = 0xF3;     //检验码                       
   
    send_ptl();                    //传输                  
   
    delay_ms(100000);
}




/**********
上面为main.c,下面为usart.c
************/


#include "usart.h"

ptl_stack tx_stack;
ptr_stack rx_stack;

void send_ptl(void)
{
    u8 i;
   
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
   
    for(i = 0; i <= 11; i++)
    {
        USART_SendData(USART1, tx_stack.data[i]);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }
}

void tx_stack_init(void)
{
    u8 i;

    for(i = 0; i <=11; i++)
    {
        tx_stack.data[i] = 0x00;
    }
   
    usart_config();
}

void rx_stack_init(void)
{
    u8 i;
   
    for(i = 0; i <=11; i++)
    {
        rx_stack.data[i] = 0;
    }

    usart_config();   
}

void usart_config(void)
{
   
    /*1、打开GPIO,AFIO,USART1的时钟*/
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA \
                            | RCC_APB2Periph_AFIO, ENABLE);
   
    /*2\初始化相应的串口引脚*/
    usart_release_gpio_init();  
   
    /*3、配置串口中断*/
    usart_nvic_config();
   
    /*4、配置串口模式*/
    usart_para_config();
}
void usart_release_gpio_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
   
    /*配置PA9为复用推挽输出*/
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /*配置PA10为浮空输入*/
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void usart_para_config(void)
{
    USART_InitTypeDef USART_InitStruct;
   
    USART_InitStruct.USART_BaudRate = 117647;                    //舵机波特率设为117647;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
   
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;  //8
    USART_InitStruct.USART_Parity = USART_Parity_No;          //n
    USART_InitStruct.USART_StopBits = USART_StopBits_1;       //1
   
    USART_Init(USART1, &USART_InitStruct);
   
    USART_ClearFlag(USART1,USART_FLAG_TC); //清除发送完成标志位
    USART_Cmd(USART1, ENABLE); //使能串口 1
   
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
void usart_nvic_config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
   
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口 1 中断
   
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
    NVIC_Init(&NVIC_InitStructure);
}

int fputc(int ch, FILE*f)
{
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET)
    {
    }
    USART_SendData(USART1,(uint8_t) ch);
    return ch;
}






/***********
上面为usart.c,下面为usart.h
************/


#ifndef __USART_H_
#define __USART_H_

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stdio.h"

typedef struct
{
    u8 data[12];
} ptl_stack;
extern ptl_stack tx_stack;

typedef struct
{
    u8 data[12];
} ptr_stack;
extern ptr_stack rx_stack;

void send_ptl(void);
void usart_config(void);
void usart_release_gpio_init(void);
void usart_para_config(void);
void usart_nvic_config(void);
void tx_stack_init(void);
void rx_stack_init(void);

#endif

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-11-28 09:33:29 | 显示全部楼层
不知道你用的哪款舵机,看样子是单线的。串口的电平转换模块和数据方向控制模块都有吗?建议先用电脑的上位机模拟一下指令的发送,看舵机是否正常转动。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-28 13:51:20 来自手机 | 显示全部楼层
我用的是ax-18舵机,上机模拟舵机好用,电平转换模块与数据方向控制模块我统一用usb to TTL但是不好用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 08:52 , Processed in 0.059471 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表