24小时热门版块排行榜    

查看: 323  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 289求调剂 +8 怀瑾握瑜l 2026-03-20 8/400 2026-03-25 09:49 by 雾散后相遇lc
[考研] 一志愿武理085500机械专业总分300求调剂 +3 an10101 2026-03-24 7/350 2026-03-25 00:00 by 山鬼0-
[考研] 281求调剂 +3 Koxui 2026-03-24 4/200 2026-03-24 22:59 by barlinike
[考研] 08工学调剂 +12 用户573181 2026-03-20 17/850 2026-03-24 21:45 by 番茄炖了西红柿
[考研] 材料调剂 +6 匹克i 2026-03-23 6/300 2026-03-24 21:09 by greychen00
[考研] 一志愿北化315 求调剂 +3 akrrain 2026-03-24 3/150 2026-03-24 19:35 by 了了了了。。
[考研] 085602 289分求调剂 +5 WWW西西弗斯 2026-03-24 5/250 2026-03-24 18:51 by jhhcooi
[考博] 申博26年 +4 八6八68 2026-03-19 4/200 2026-03-24 15:49 by 小Ben呵呵
[考研] 307求调剂 +3 余意卿 2026-03-21 6/300 2026-03-24 15:03 by 余意卿
[考研] 一志愿华东理工大学081700,初试分数271 +5 kotoko_ik 2026-03-23 6/300 2026-03-24 10:29 by 学术搬砖er
[考研] 291求调剂 +8 hhhhxn.. 2026-03-23 8/400 2026-03-23 23:15 by peike
[考研] 284求调剂 +3 yanzhixue111 2026-03-23 6/300 2026-03-23 22:58 by pswait
[考研] 306求调剂 +9 chuanzhu川烛 2026-03-18 9/450 2026-03-23 13:17 by luoyongfeng
[考研] 求调剂材料学硕080500,总分289分 5+3 @taotao 2026-03-19 21/1050 2026-03-23 10:17 by 冠c哥
[考研] 寻找调剂 +4 倔强芒? 2026-03-21 4/200 2026-03-22 16:14 by 木托莫露露
[考研] 考研调剂 +3 呼呼?~+123456 2026-03-21 3/150 2026-03-21 20:04 by 无际的草原
[考研] 一志愿深大,0703化学,总分302,求调剂 +4 七月-七七 2026-03-21 4/200 2026-03-21 18:20 by 学员8dgXkO
[考研] 308求调剂 +3 阿姐阿姐家啊 2026-03-18 3/150 2026-03-20 23:24 by JourneyLucky
[考研] 086500 325 求调剂 +3 领带小熊 2026-03-19 3/150 2026-03-20 18:38 by 尽舜尧1
[考研] 0856调剂,是学校就去 +8 sllhht 2026-03-19 9/450 2026-03-20 14:25 by 无懈可击111
信息提示
请填处理意见