智能车心得分享(三)-- 底层配置(弄清我们要做什么)

嗯,各位好久不见,最近有点事,现在在写要求的日志周志,就顺手写下智能车,趁着现在我还有些印象。

首先,我们做车要知道,我们在做些什么吧!软件的部分,就是控制控制一个人走路,我们走路是怎么走的?首先你要有个能走的腿,那在软件中就是一些底层的配置(比如说你要知道自己的速度,就要配置编码器相关的函数,虽然厂商会给你配好更加底层,但是还需要自己做一些处理,这个在后面代码示例中我会去讲解),然后有一个能看的眼镜,这些便是传感器(首先我是做电磁的,所以电磁接触多一些;其次摄像头这种一般都会是学校的祖传代码,我这里也不能去开源,但是网上是有相关代码的,可以去搜集),最后有一个去处理这些信息和下达指令的大脑,这就是我们的单片机来做的事了(这里的说法可能不是那么的严谨,但是大概是这么个意思了)。然后呢,有了这些我们就可以察觉相关的元素,并且做出相应的控制,这些就是智能车的大体思路了
在这里插入图片描述

  1. 接下来,我们第一步,也是最重要的一步:让车动起来!(pwm)

车轮是什么控制的?电机,那么如果我们通过主控输出两路pwm波给驱动的话,驱动也会输出相应的电流(当然这个的线性程度是有的,但是不是很高),这样我们就可以让车动起来了!
首先我们看下逐飞的库(源代码):

void pwm_init (TIM_enum tim, TIM_PWMPIN_enum pin, uint32 freq, uint32 duty);//初始化
void pwm_enable (TIM_enum tim);//使能
void pwm_disable (TIM_enum tim);//失能
void pwm_duty_updata (TIM_enum tim, TIM_PWMPIN_enum pin, uint32 duty);//更新占空比

首先毋庸置疑的是底层的初始化,在我的校赛程序中是将所有的初始化放在了一个函数中,再在main中调用,类似下图:

void all_init(void)
{
    lcd_init();
    myadc_init();
    Encoder_Init();
    Motor_PWM_Init();
    Scheduler_Init();
    KEY_Init();
	board_init(true);
}

然后是pwm的初始化:

void Motor_PWM_Init(void)
{
    mypwm_init(TIM_5,TIM_5_CH1_A00,0,6400,0);//左轮
    gpio_init( A1, GPO, 0, GPO_PUSH_PULL);
    mypwm_init(TIM_5,TIM_5_CH3_A02,0,6400,0);//右轮
    gpio_init( A3, GPO, 1, GPO_PUSH_PULL);
}

这样的话理论上车就能跑了,我们的第一个目标就完成了,然后呢,再通过void pwm_duty_updata (TIM_enum tim, TIM_PWMPIN_enum pin, uint32 duty); 这个函数改变车的速度,这样车就可以有不同的速度,或者转弯了(因为我是三轮,通过差速来进行控制的)

在这里为什么会选择6400作为它的周期呢?好像是和晶振还有车的特性来设置的,和你的电机有关,具体就忘记了。。。

  1. 知道我们的速度(编码器)

源代码:

void Encoder_Init(void)
{
void	tim_encoder_init			(TIM_enum tim, TIM_ENC_PIN_enum PULSEA_pin, TIM_ENC_PIN_enum PULSEB_pin);//初始化A/B向
void	tim_encoder_rst				(TIM_enum tim);//重载
int16	tim_encoder_get_count		(TIM_enum tim);//读数
}

我的代码:

void Encoder_Init(void)
{
 tim_encoder_init(TIM_3, TIM_3_ENC1_B04, TIM_3_ENC2_B05);// 初始化 TIM_3 B04/B05 正交编码器采集
 tim_encoder_init(TIM_4, TIM_4_ENC1_B06, TIM_4_ENC2_B07);// 初始化 TIM_4 B06/B07 正交编码器采集
}

int Encoder_Read(int TIMx)
{
	int value_1;
	switch(TIMx)
	{
		case 3:value_1 =  tim_encoder_get_count(TIM_3);tim_encoder_rst(TIM_3);break;//右侧
		case 4:value_1 =  tim_encoder_get_count(TIM_4);tim_encoder_rst(TIM_4);break;//左侧
		default:value_1=0;
	}
  return value_1;
}

这就没什么要说的了,emm,好吧,为什么要清零呢?这样做的话,读取的数就是你所设置的单位时间
(也就是通过定时器所设置的时间),所记的数,可以算出相对应的实际速度(存在着误差),个人对所有数据的看法,他们只是数据,虽然有相关的物理意义,但是当作数据处理就足够了。当然只是个人看法了,不是很严谨。

现在就知道我们的速度了,但是我们会给一个期望速度使我们的速度逐步达到期望速度,这个时候就会使用PID控制,后面如果写的话,也只是代码的使用和调参方法,不会细写它的原理(个人能力不足,容易讲出问题),如果感兴趣可以在csdn中找一下。

  1. 我们的眼睛(电磁传感器)

源代码:

void adc_init (ADCN_enum adc, ADCCH_enum ch, ADCRES_enum resolution)//初始化
uint16 adc_mean_filter(ADCN_enum adc, ADCCH_enum ch, uint8 count)//均值滤波

我的代码:

void myadc_init(void)
{
	adc_init(ADC_2, ADC2_CH04_A04, ADC_12BIT);
	adc_init(ADC_2, ADC2_CH05_A05, ADC_12BIT);
	adc_init(ADC_2, ADC2_CH06_A06, ADC_12BIT);
	adc_init(ADC_2, ADC2_CH07_A07, ADC_12BIT);
	adc_init(ADC_2, ADC2_CH14_C04, ADC_12BIT);
	adc_init(ADC_2, ADC2_CH15_C05, ADC_12BIT);
}

void my_adcfilter_get(void)
{
    int i=0,j=0;

    for(j=0; j<8; j++)
    {
        adc[0][j] =adc_mean_filter(ADC_2,ADC2_CH04_A04,5);
        adc[1][j] =adc_mean_filter(ADC_2,ADC2_CH05_A05,5);
        adc[2][j] =adc_mean_filter(ADC_2,ADC2_CH06_A06,5);
        adc[3][j] =adc_mean_filter(ADC_2,ADC2_CH07_A07,5);
        adc[4][j] =adc_mean_filter(ADC_2,ADC2_CH14_C04,5);
        adc[5][j] =adc_mean_filter(ADC_2,ADC2_CH15_C05,5);
    }

    for(j=0; j<8; j++)
    {
        ADC_RR=adc[0][j];
        ADC_R =adc[1][j];
        ADC_RM=adc[2][j];
        ADC_LM=adc[3][j];
        ADC_L =adc[4][j];
        ADC_LL=adc[5][j];

        ADC_LL =nomal(ADC_LL,LLRR_MAX);
        ADC_L	 =nomal(ADC_L,LR_MAX);
        ADC_LM =nomal(ADC_LM,LMRM_MAX);
        ADC_RM =nomal(ADC_RM,LMRM_MAX);
        ADC_R  =nomal(ADC_R,LR_MAX);
        ADC_RR =nomal(ADC_RR,LLRR_MAX);
    }
}


这个就是读值,滤波没什么讲的了

以上就是最最底层的一些初始化了,之后我们就要想办法让车如何沿着电磁线跑起来。当然,初始还有其他的暂时使用不上,之后再补充吧。

  • 14
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值