智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1788|回复: 11
打印 上一主题 下一主题

新手写的二值化算法 可是无法控制舵机根据采集来的数据转动啊 求教

[复制链接]

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
128
威望
70
贡献
30
兑换币
32
注册时间
2014-10-5
在线时间
14 小时
毕业学校
上海理工大学
跳转到指定楼层
1#
发表于 2014-12-25 17:09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void CCD_Init(void)
{
  unsigned char j;
  unsigned char min=Pixel[0],max=Pixel[0];
  for(j=1;j<127;j++)
  {
    if(Pixel[j]<min)  min=Pixel[j];  
  }
  for(j=1;j<127;j++)
  {
    if(Pixel[j]>max)  max=Pixel[j];  
  }
  Threshold=(max+min)/2; //找到最高点和最低点取平均值作为阈值
}


/*********************************************/
void binaryzation(void)
{
  unsigned char j;
  for(j=0;j<128;j++)
  {
    if(Pixel[j]<Threshold)  //低于阈值的全部当为  黑色
    {
      Pixel_History0[j]=1;  
    }
    else Pixel_History0[j]=0;  //高于阈值的全部当为 白色
  }
}
/************************************************/

void scan(void)
{
  unsigned char j;
  unsigned char n,m;
  
  j=10;
  while(!Pixel_History0[j])
  {
    j++;
  }
  n=j;
  
  j=118;
  while(!Pixel_History0[j])
  {
    j--;
  }
  m=j;
  Midpoint=(n+m)/2;
  
/*  if((Midpoint-64>5)&&(Midpoint-64<=15)) ex_angle=75;
    else if((Midpoint-64>15)&&(Midpoint-64<=25)) ex_angle=78;
      else if((Midpoint-64>25)&&(Midpoint-64<=35)) ex_angle=81;
        else if((Midpoint-64>35)&&(Midpoint-64<=45)) ex_angle=84;
          else if((Midpoint-64>45)&&(Midpoint-64<=55)) ex_angle=87;
            else if(Midpoint-64>55) ex_angle=90;   
              else if((Midpoint-64<-5)&&(Midpoint-64>=-15)) ex_angle=69;
                else if((Midpoint-64<-15)&&(Midpoint-64>=-25)) ex_angle=66;
                  else if((Midpoint-64<-25)&&(Midpoint-64>=-35)) ex_angle=63;
                    else if((Midpoint-64<-35)&&(Midpoint-64>=-45)) ex_angle=60;
                      else if((Midpoint-64<-45)&&(Midpoint-64>=-55)) ex_angle=57;
                        else if(Midpoint-64<-55) ex_angle=54;
                          else ex_angle=72;      */
                          //不同中心数组的序数与占空比的线性关系
                           
  angle=Midpoint/3+51;

}

/***********************************************/
void run(unsigned char speed,unsigned char angle)
{
  PWMDTY3=speed;
  PWMDTY1=angle;   
}
回复

使用道具 举报

41

主题

435

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4765

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

威望
2652
贡献
1247
兑换币
1406
注册时间
2014-3-28
在线时间
433 小时
毕业学校
bieyou
2#
发表于 2014-12-25 17:43:41 | 只看该作者
还是别贴代码了 很少人看的 看别人的代码 很头疼的  虽然不是很长
回复 支持 反对

使用道具 举报

32

主题

3009

帖子

0

精华

杰出人士

学期班的来卖萌?

Rank: 12Rank: 12Rank: 12

积分
14832

在线王奖章活跃会员奖章优秀会员奖章论坛元老奖章资源大师奖章

威望
5952
贡献
3172
兑换币
4257
注册时间
2013-11-26
在线时间
2854 小时
3#
发表于 2014-12-25 17:57:09 | 只看该作者
看的出来,的却是新手写的。取值和二值化之后的处理都不够,判断也是很粗糙。不过应该 是 可以乱动。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
128
威望
70
贡献
30
兑换币
32
注册时间
2014-10-5
在线时间
14 小时
毕业学校
上海理工大学
4#
 楼主| 发表于 2014-12-25 18:13:32 | 只看该作者
zhou1994 发表于 2014-12-25 17:57
看的出来,的却是新手写的。取值和二值化之后的处理都不够,判断也是很粗糙。不过应该 是 可以乱动。

您好 请问我的舵机无法根据CCD采集的数据转动角度,只能恢复正位 然后就不能动了是什么原因
下一楼是主函数
我才刚做这个几天 新手不好意思

回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
128
威望
70
贡献
30
兑换币
32
注册时间
2014-10-5
在线时间
14 小时
毕业学校
上海理工大学
5#
 楼主| 发表于 2014-12-25 18:14:14 | 只看该作者
void main(void) {

    unsigned char i;
    unsigned char send_data_cnt = 0;
    unsigned char *pixel_pt;

    SCI0_Init();

    PIT_Init();

    AD_Init();

    CCD_IO_Init();

    LED_Init();
   
    PWM_Init();
   

    /* Init Pixel Array */
    pixel_pt = Pixel;
    for(i=0; i<128+10; i++) {
        *pixel_pt++ = 0;
    }
   
   
    EnableInterrupts;

    for(;;) {

        /* 20ms Task */
        if(TimerFlag20ms == 1) {
            TimerFlag20ms = 0;

            /* Flash LED */
            LED1 = ~LED1;

            /* Sampling CCD data */
            ImageCapture(Pixel);

            /* Calculate Integration Time */
            CalculateIntegrationTime();

            /* Send data to CCDView every 100ms */
            if(++send_data_cnt >= 5) {
                send_data_cnt = 0;
                SendImageData(Pixel);
            }
            /*******************/
            CCD_Init();            
            
            /*******************/
            binaryzation();         //二值化函数
            
            /*******************/
            scan();                 //检测函数
            
            /******************/
            run(speed,angle);       //执行函数

        }

    } /* End of for(;;); loop */

} /* End of main() */
回复 支持 反对

使用道具 举报

32

主题

3009

帖子

0

精华

杰出人士

学期班的来卖萌?

Rank: 12Rank: 12Rank: 12

积分
14832

在线王奖章活跃会员奖章优秀会员奖章论坛元老奖章资源大师奖章

威望
5952
贡献
3172
兑换币
4257
注册时间
2013-11-26
在线时间
2854 小时
6#
发表于 2014-12-25 18:15:19 | 只看该作者
Uuu、 发表于 2014-12-25 18:13
您好 请问我的舵机无法根据CCD采集的数据转动角度,只能恢复正位 然后就不能动了是什么原因
下一楼是主函 ...

你先试试能不能控制舵机转在考虑加ccd
回复 支持 反对

使用道具 举报

10

主题

406

帖子

0

精华

跨届大侠

车魔

Rank: 10Rank: 10Rank: 10

积分
11152

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章资源大师奖章

威望
7292
贡献
2938
兑换币
1271
注册时间
2014-1-7
在线时间
461 小时
7#
发表于 2014-12-25 18:34:28 | 只看该作者
:(:(:(:(
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
128
威望
70
贡献
30
兑换币
32
注册时间
2014-10-5
在线时间
14 小时
毕业学校
上海理工大学
8#
 楼主| 发表于 2014-12-25 18:44:45 | 只看该作者
zhou1994 发表于 2014-12-25 18:15
你先试试能不能控制舵机转在考虑加ccd

光写舵机程序舵机是可以转动的 加了CCD就只会回复正位  看了很久都没看出程序哪出错了
回复 支持 反对

使用道具 举报

32

主题

3009

帖子

0

精华

杰出人士

学期班的来卖萌?

Rank: 12Rank: 12Rank: 12

积分
14832

在线王奖章活跃会员奖章优秀会员奖章论坛元老奖章资源大师奖章

威望
5952
贡献
3172
兑换币
4257
注册时间
2013-11-26
在线时间
2854 小时
9#
发表于 2014-12-25 18:55:07 | 只看该作者
Uuu、 发表于 2014-12-25 18:44
光写舵机程序舵机是可以转动的 加了CCD就只会回复正位  看了很久都没看出程序哪出错了

巡线的那个while逻辑。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
128
威望
70
贡献
30
兑换币
32
注册时间
2014-10-5
在线时间
14 小时
毕业学校
上海理工大学
10#
 楼主| 发表于 2014-12-25 19:01:39 | 只看该作者
zhou1994 发表于 2014-12-25 18:55
巡线的那个while逻辑。

while的逻辑有问题吗
我的想法是从两边往中间找黑线 直到找到黑线边沿的两个点 取平均得到黑线中点的位置
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 18:11 , Processed in 0.120016 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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