24小时热门版块排行榜    

查看: 311  |  回复: 0

ghdnui

铜虫 (小有名气)

[求助] 串口中断接收数据 求助 感谢感谢

我想用串口中断控制舵机机械臂做动作,总的有4个舵机。有几种状态,分别是 默认姿式, 抓东西,放东西 ,回位。

我用的是串口中断来接收数据来控制舵机的角度,ox01对应默认姿式,ox02对应抓东西,ox03对应放东西,ox04对应回位。

但我写的程序有问题,主要就是我发一个指令后舵机有响应,但响应一点点,也就是说我要连发几十次的相同指令才能完整的做写一个动作。我用示波器看过波形,控制舵机的波形只有一闪而过的脉冲。结合我的程序说明在switch中假设是0x01指令,对应的case在执行的时候就被打断了。具体程序如下:哪个高人指点,新人求照。


void NVIC_Configration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


void USART1_Configuration(void)       
{
       
        USART_InitTypeDef        USART_InitStructure;
        GPIO_InitTypeDef        GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA , ENABLE);         //开启串口功能

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                                          //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA , &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                                                        //浮空输入
    GPIO_Init(GPIOA , &GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate = 9600;                                                          //波特率为9600
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;                        //8位数据长度
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                                //停止位1位
        USART_InitStructure.USART_Parity = USART_Parity_No;                                        //无奇偶校验
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;                //禁用硬件流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;                 //接收和发送模式
        USART_Init(USART1,&USART_InitStructure);

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);         //中断方式接收数据
//        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);         //中断方式发送数据
//        USART_ClearFlag(USART1,USART_FLAG_TXE);                          //采用查询方式发送数据
//        USART_ClearFlag(USART1,USART_FLAG_TC);
//        USART_ClearFlag(USART1,USART_FLAG_RXNE);        //采用查询方式接收数据

        USART_Cmd(USART1,ENABLE);                                                                                        //使能串口1
}


void morenweizi(void)
{
         SetJointAngle(0,0);
         SetJointAngle(1,180);
         SetJointAngle(2,-150);
         SetJointAngle(3,-90);

}

void GripperControl(u8 open)
{
        float angle;
        angle=(u16)(249.0+ 6.5 *(float)open);
        TIM_SetCompare4(TIM4,angle);                                          //TIM4和通道4控制机械爪
}

int main(void)
{

        RCC_Configuration();
        TIM_Configuration();
        SysTick_Configuration();
        NVIC_Configration();
        USART1_Configuration();
        SteppingMotor_Config();
        while(1);
       

  }


void USART1_IRQHandler(void)
{       
    if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
    {               
        CommandNowData = USART_ReceiveData(USART1);
                switch(CommandNowData)
                {                 
                         case 0x01:
                         {
                                morenweizi();                //初始姿态
                                USART_ClearFlag(USART1,USART_FLAG_TC);
                                USART_SendData(USART1,0x01);
                                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                       
                                break;
                        }
                        case 0x02:
                         {
                                 GripperControl(100); //抓子打开
                                zhuaidongxi();                 //伸直机械臂
                                USART_SendData(USART1,0x02);
                                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                                break;
                        }
                        case 0x03:
                         {
                                GripperControl(50) //关抓子
                                USART_SendData(USART1,0x03);
                                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                                break;
                        }
                        case 0x04:
                         {
                                huiwei();                //返回等待松抓
                                USART_SendData(USART1,0x04);
                                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                                break;
                        }
                        case 0x05:
                         {
                                GripperControl(100); //放开抓子
                                morenweizi();                //默认
                                USART_SendData(USART1,0x05);
                                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                                break;
                        }
               
                        default:        break;

                        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                   }
        }
          
}

我尝试过把中断函数里面的switch放在main里面,但效果是一样的,求哪个老大相助。
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : 机械臂舵机测试2.rar
  • 2013-11-07 19:45:47, 500.83 K

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

智能机器人

Robot (super robot)

我们都爱小木虫

找到一些相关的精华帖子,希望有用哦~

科研从小木虫开始,人人为我,我为人人
相关版块跳转 我要订阅楼主 ghdnui 的主题更新
信息提示
请填处理意见