OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4902|回复: 6

关于AVR单片机的问题6

[复制链接]

34

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-5-27
在线时间
7 小时
发表于 2015-2-4 09:51:33 | 显示全部楼层 |阅读模式
5金钱
 

各位高手,小弟正在基于AVR开发一款智能车,实现舵机超声波测距兼避障功能。遇到了一个问题:舵机只是单方向旋转,转动过程断断续续。请教其中的原因。谢谢大家。部分代码如下:

    while(1)
    {
       delay_nus (200);      
  
       start_SB();             
        if (CSB_data_lcd>400)
        {
           LCD_write_string(7,1,"Err!");  
        }
        else
        {
            ge =(CSB_data_lcd%100%10)+48;
            shi =(CSB_data_lcd%100/10)+48;
            bai =(CSB_data_lcd%1000/100)+48;
            qian =(CSB_data_lcd/1000)+48;
       
           LCD_write_char(7,1,qian);
           LCD_write_char(8,1,bai);
           LCD_write_char(9,1,shi);
           LCD_write_char(10,1,ge);
           LCD_write_string(12,1,"CM");
        
      }

       if(CSB_data_lcd<20)
       {
           stop;
           delay_nms(10);
           k=1;
       }
      
      if(k == 1)
      {
         if(s_1<1)
         {
            DUTY1 = 45;
            S_L=CSB_data_lcd;
         }
         else if(s_1>=1&&s_1<2)
         {
            DUTY1 = 170;
            S_R=CSB_data_lcd;
            z=1;
         }       
         else
         {
            DUTY1 = 110;
            if(S_R>=15&&S_L<=15&&CSB_data_lcd<20)
            {
                left;
                delay_nms(40);
                stop;
            }
            else if(S_R<=15&&S_L>=15&&CSB_data_lcd<20)
            {
                right;
                delay_nms(40);
                stop;
            }
            else if(S_R<=15&&S_L<=15&&CSB_data_lcd<25&&z==1)
            {
                back;
                delay_nms(200);
                stop;
                z=0;
            }
            else if(S_R>=15&&S_L>=15&&CSB_data_lcd<20)
            {
                right;
                delay_nms(40);
                stop;
            }
            else
            {
                k=0;
            }
         }
      }
      if(k==0)
      {
          forward;
         z=0;
      }
      if(s_1>2)
      {
         s_1 = 0;
         ms_20 = 0;
      }
   } 
}
 
#pragma interrupt_handler timer1_ovf_isr:9 //timer0 overflow
void timer1_ovf_isr(void)
{
    TCNT1H = 0xff;
   TCNT1L = 0xF6;

   t++;
   
   if(t <= DUTY1)
    {

       PORTA |= (1<<A0);
   }
   else
   {
       PORTA &= ~(1<<A0);
   }
  
   if(t >= 2000)              
   {
      ms_20++;
      t=0;
   }

   if(ms_20==50)
   {
      s_1++;
       ms_20=0;
   }
  
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-4 23:20:27 | 显示全部楼层
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-10-22
在线时间
0 小时
发表于 2015-2-10 17:24:07 | 显示全部楼层
先直接给舵机设数值,,看看舵机转不转,不转的话自己找原因,,,转的不流畅可能是给舵机的频率不对。。
你这个是AVR的?看着好像飞思卡尔那些商家写的函数的格式啊
回复

使用道具 举报

34

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-5-27
在线时间
7 小时
 楼主| 发表于 2015-2-15 08:51:53 | 显示全部楼层

谢谢楼上,我试试。芯片是AVR的,不是飞思卡尔的。

回复

使用道具 举报

34

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-5-27
在线时间
7 小时
 楼主| 发表于 2015-2-15 09:32:14 | 显示全部楼层
mavapo您好,按照您说的,我试着改变了舵机控制信号的频率,但是舵机仍然是断断续续地在2个角度之间转动。
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-2-6
在线时间
3 小时
发表于 2015-2-15 10:44:41 | 显示全部楼层
也可能是你的脉冲波不干净导致,你拿示波器看看PWM波是不是干净的
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2013-9-11
在线时间
13 小时
发表于 2015-2-16 10:20:52 | 显示全部楼层
用信号发生器直接产生信号加给舵机,测试舵机是否正常
然后再推问题出在哪
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 20:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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