智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3070|回复: 19
打印 上一主题 下一主题

我们才把元件买回来...一切刚开始。。

  [复制链接]

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
威望
159
贡献
35
兑换币
0
注册时间
2012-3-12
在线时间
11 小时
跳转到指定楼层
1#
发表于 2012-3-13 00:19:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们组刚组好,元件刚买到。。
我换了好几个马甲,论坛泡了一个月了。
看到大家从迷茫到现在很多都站起来了。。
而我们组却什么也不知道。。。
我是负责程序的。。。说真的,什么也不懂。
我们也没学长带,3个大二的纯爷们。
我们没车模(学校要等什么做出点成效才给)
论坛里,什么初始化,什么卡尔曼滤波,什么互补,我们都没有,也不知道。。。
但是我们有一颗努力的心。
板子正在焊,芯片128
在这里,希望大家能告诉我们,一切能共用的程序行么。。。
比如初始化,比如AD转化...很多很多。
希望大家把能共享的程序资源,都回复给我们好么。
在这里,我谢谢大家了。
我们有着一颗让学校发车模给我们的心。
(官方1.0,2.0已经详细阅读与做了笔记,官方程序,大家说下在哪就行,或者贴上也行)

再次谢谢了。大家都是电磁的。我知道我们晚了些。但是我们这次参加不了比赛,我们依旧想拿到车模,参加明年的比赛!
希望大家能帮助我们!
(能共享的贴出来或者发给我也行...270929102@qq.com

49

主题

3751

帖子

1

精华

顶级版主

Rank: 11Rank: 11Rank: 11Rank: 11

积分
27948

资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章技术大牛奖章

威望
10632
贡献
10964
兑换币
4564
注册时间
2010-11-23
在线时间
3176 小时
2#
发表于 2012-3-13 00:28:20 | 只看该作者
单片机没啥难的。照着文档的寄存器一个个配置就行了。
这比用抄来的代码能学会更多的东西。
回复 支持 反对

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
威望
159
贡献
35
兑换币
0
注册时间
2012-3-12
在线时间
11 小时
3#
 楼主| 发表于 2012-3-13 00:31:32 | 只看该作者
turf456 发表于 2012-3-13 00:28
单片机没啥难的。照着文档的寄存器一个个配置就行了。
这比用抄来的代码能学会更多的东西。

英文版的。 4J没过的孩子啊。。。
大姐,怎么办呢?
回复 支持 反对

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
威望
159
贡献
35
兑换币
0
注册时间
2012-3-12
在线时间
11 小时
4#
 楼主| 发表于 2012-3-13 00:34:06 | 只看该作者
我已经逛论坛留下的这个。能用么?


//MCU:Mega16;晶振:8MHz;系统频率:50Hz;20ms;
//赵国霖:10.05.10;
#include <iom16v.h>
#include <macros.h>
#include <math.h>

//#define checkbit(var,bit)     (var&(0x01<<(bit)))     /*定义查询位函数*/
//#define setbit(var,bit)     (var|=(0x01<<(bit)))     /*定义置位函数*/
//#define clrbit(var,bit)     (var&=(~(0x01<<(bit)))) /*定义清零位函数*/


//-------------------------------------------------------
//输出端口初始化
void PORT_initial()
{
        DDRA=0b00000000;
        PINA=0X00;
        DDRB=0b00000000;
        PINB=0X00;
        DDRC=0b00010111;
        PINC=0X00;
        DDRD=0b11110010;
        PIND=0X00;
}


//-------------------------------------------------------
//定时器1初始化
void T1_initial()                                       
{
        TCCR1A|=(1<<COM1A1)|(1<<WGM10)|(1<<COM1B1);                                //T1:8位快速PWM模式、匹配时清0,TOP时置位
        TCCR1B|=(1<<WGM12)|(1<<CS11);                        //PWM:8分频:8M/8/256=4KHz;
}


//-------------------------------------------------------
//定时器2初始化
void T2_initial()                        //T2:计数至OCR2时产生中断
{
        OCR2=0X4E;                        //T2:计数20ms(0X9C)10ms(0X4E)时产生中断;
        TIMSK|=(1<<OCIE2);
        TCCR2|=(1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20);                        //CTC模式,1024分频
}


//-------------------------------------------------------
//外部中断初始化
void INT_initial()
{
        MCUCR|=(1<<ISC01)|(1<<ISC00)|(1<<ISC11)|(1<<ISC10);                        //INT0、INT1上升沿有效
        GICR|=(1<<INT0)|(1<<INT1);                        //外部中断使能
}


//-------------------------------------------------------
//串口初始化;
void USART_initial( unsigned int baud )
{       
        UBRRH = (unsigned char)(baud>>8);                //设置波特率;
        UBRRL = (unsigned char)baud;
        UCSRB = (1<<RXEN)|(1<<TXEN);                //接收器与发送器使能;
        UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);                //设置帧格式: 8 个数据位, 1 个停止位;
}


//-------------------------------------------------------
//串口发送数据;
void USART_output( unsigned char data )
{
        while ( !( UCSRA & (1<<UDRE)));                //等待发送缓冲器为空;
        UDR = data;                //将数据放入缓冲器,发送数据;
}

//-------------------------------------------------------
//计算LH侧轮速:INT0中断;
//-------------------------------------------------------
int speed_real_LH;
//-------------------------------------------------------
#pragma interrupt_handler SPEEDLHINT_fun:2
void SPEEDLHINT_fun()
{
        if (0==(PIND&BIT(0)))
        {
                speed_real_LH+=1;
        }
        else
        {
                speed_real_LH-=1;
        }
}


//-------------------------------------------------------
//计算RH侧轮速,:INT1中断;
//同时将轮速信号统一成前进方向了;
//-------------------------------------------------------
int speed_real_RH;
//-------------------------------------------------------
#pragma interrupt_handler SPEEDRHINT_fun:3
void SPEEDRHINT_fun()
{
        if (0==(PIND&BIT(1)))
        {
                speed_real_RH-=1;
        }
        else
        {
                speed_real_RH+=1;
        }
}


//-------------------------------------------------------
//ADport采样:8位,采样基准电压Aref
//-------------------------------------------------------
//static int AD_data;
//-------------------------------------------------------
int ADport(unsigned char port)
{
        ADMUX=port|(1<<ADLAR);       
        ADCSR|=(1<<ADEN)|(1<<ADSC)|(1<<ADPS1)|(1<<ADPS0);                        //采样频率为8分频;
        while(!(ADCSR&(BIT(ADIF))));
//        AD_data=ADCH;
//        AD_data-=128;
        return (ADCH-128);
}


/*
//-------------------------------------------------------
//Kalman滤波
//-------------------------------------------------------
extern float angle, angle_dot;

static const float Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.05;                        //注意:dt的取值为kalman滤波器采样时间;
static float P[2][2] = {
                                                        { 1, 0 },
                                                        { 0, 1 }
                                                };
       
static float Pdot[4] ={0,0,0,0};

static const char C_0 = 1;

static float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
//-------------------------------------------------------
void Kalman_Filter(float angle_m,float q_m)                        //q_m:gyro_measure
{
        angle+=(q_m-q_bias) * dt;
       
        Pdot[0]=Q_angle - P[0][1] - P[1][0];
        Pdot[1]=- P[1][1];
        Pdot[2]=- P[1][1];
        Pdot[3]=Q_gyro;
       
        P[0][0] += Pdot[0] * dt;
        P[0][1] += Pdot[1] * dt;
        P[1][0] += Pdot[2] * dt;
        P[1][1] += Pdot[3] * dt;
       
       
        angle_err = angle_m - angle;
       
       
        PCt_0 = C_0 * P[0][0];
        PCt_1 = C_0 * P[1][0];
       
        E = R_angle + C_0 * PCt_0;
       
        K_0 = PCt_0 / E;
        K_1 = PCt_1 / E;
       
        t_0 = PCt_0;
        t_1 = C_0 * P[0][1];

        P[0][0] -= K_0 * t_0;
        P[0][1] -= K_0 * t_1;
        P[1][0] -= K_1 * t_0;
        P[1][1] -= K_1 * t_1;
       
       
        angle        += K_0 * angle_err;
        q_bias        += K_1 * angle_err;
        angle_dot = q_m-q_bias;
}
*/

//-------------------------------------------------------
//互补滤波
//************************       
extern float angle_cfed;
static float bias_cf,gyro_cf_temp;
static float dt=0.01;
//************************
void complement_filter(float angle_cf,float gyro_cf)
{
        bias_cf*=0.998;                        //陀螺仪零飘低通滤波;500次均值;
        bias_cf+=gyro_cf*0.002;
        gyro_cf_temp=gyro_cf-bias_cf;
        angle_cfed=(angle_cfed+gyro_cf_temp*dt)*0.95+angle_cf*0.05;       
        //加速度低通滤波;20次均值;按100次每秒计算,低通5Hz;
}
       




//-------------------------------------------------------
//AD采样;
//以角度表示;
//加速度计:1.2V=1g=90°;满量程:1.3V~3.7V;
//陀螺仪:0.5V~4.5V=-80°~+80°;满量程5V=200°=256=200°;
//-------------------------------------------------------
//extern int speed_need,turn_need;//,angle_cfed;
static float gyro,acceler;                //phi;
//unsigned char temp_data;
//-------------------------------------------------------
void AD_calculate()
{
        extern float angle;

        //GICR&=(~(1<<INT0) & ~(1<<INT1));                                                //采样期间屏蔽外部中断
       
        acceler=ADport(2);
        gyro=ADport(3);       
       
        acceler*=1.465;                        //以角度表示:90/(128*1.2/2.5)=1.46484375;
        gyro*=0.78125;                        //角速度系数:100/128=0.78125;       
       
        complement_filter(acceler,gyro);
}
       


//-------------------------------------------------------
//PWM输出
void PWM_output (int PWM_LH,int PWM_RH)
{
               
        if (PWM_LH<-255)
        {
                PWM_LH=255;
                PORTD|=BIT(6);
        }
        else if (PWM_LH<0)
        {
                PWM_LH=-PWM_LH;
                PORTD|=BIT(6);
        }
        else if (PWM_LH==0)
        {
                PWM_LH=1;
        }
        else if (PWM_LH<256)
        {
                PORTD&=~BIT(6);
        }
        else if (PWM_LH>255)
        {
                PWM_LH=255;
                PORTD&=~BIT(6);
        }
       
       
        if (PWM_RH<-255)
        {
                PWM_RH=255;
                PORTD|=BIT(7);
        }
        else if (PWM_RH<0)
        {
                PWM_RH=-PWM_RH;
                PORTD|=BIT(7);
        }
        else if (PWM_RH==0)
        {
                PWM_RH=1;
        }
        else if (PWM_RH<256)
        {
                PORTD&=~BIT(7);
        }
        else if (PWM_RH>255)
        {
                PWM_RH=255;
                PORTD&=~BIT(7);
        }
       
        OCR1AH=0;
        OCR1AL=PWM_LH;                        //OC1A输出;
       
        OCR1BH=0;
        OCR1BL=PWM_RH;                        //OC1B输出;
       
}




//-------------------------------------------------------
//计算PWM输出值
//车辆直径:76mm; 12*64pulse/rev; 1m=3216pulses;
//*************************************//       
//extern int speed_real_LH,speed_real_RH;

//const float Kx=0.054/3216;                                        //位移系数:1m=/3216;
//const float Kx_dot=2.95/64.32;                                //速度系数count*50Hz/(12*64pulse/rev))*0.238.75m/rev=50/3216;
//const float Kphi=9;                                                                        //角度比例调整;
//const float Kphi_dot=0.6;                                                        //角速度比例调整;

//static int spall,spdiff,speed_error,AVR_output;
//static int differr_0,differr_1,differr_2,differr_all;
static int speed_output_LH,speed_output_RH;
//*************************************//       
void PWM_calculate()       
{
       
        //spall=(speed_real_LH+speed_real_RH)*0.5;       
        //spdiff=speed_real_RH-speed_real_LH;
        //speed_error+=spall-speed_need;
        //AVR_output=Kx*speed_error+Kx_dot*spall+Kphi*angle+Kphi_dot*angle_dot;                //计算所需电压;
        //AVR_output*=36;                                                                                //PWM:256/7.2V=35.55;
        /*
        if (AVR_output>=0)
        {
                AVR_output+=4;
        }
        else
        {
                AVR_output-=4;
        }
               
        differr_2=differr_1;                                                        //左右轮速差PID控制;
        differr_1=differr_0;
        differr_0=turn_need-spdiff;
        differr_all += 1*(differr_0 - differr_1) + 0.2*differr_0 + 2*(differr_0 - 2*(differr_1) + differr_2);
        */
        //speed_output_LH = AVR_output;
        //speed_output_RH = AVR_output;
       
        speed_output_LH = 2*angle_cfed;
        speed_output_RH = -2*angle_cfed;
               
        PWM_output (speed_output_LH,speed_output_RH);       
}

//-------------------------------------------------------
//定时器2中断处理
//*************************************//
static unsigned char temp;
//extern int speed_real_LH,speed_real_RH;
//*************************************//
#pragma interrupt_handler T2INT_fun:4
void T2INT_fun()                                               
{
        AD_calculate();
       
        if(temp>=4)                        //10ms即中断;每秒计算PWM:100/4=25次;
        {
                PWM_calculate();
               
                USART_output(angle_cfed+128);
                USART_output(speed_real_LH+128);
                USART_output(speed_real_RH+128);       
                       
                speed_real_LH=0;
                speed_real_RH=0;
                               
                temp=0;
        }
       
        temp+=1;
       
}



//*************************************//
float angle, angle_dot;                                        //angle_cfed;
//*************************************//
int speed_need,turn_need;
//*************************************//

//*************************************//
void main()
{
        PORT_initial();
        T1_initial();
        T2_initial();
        INT_initial();
        USART_initial (18200);
       
        SEI();
               
        while(1)
        {
                ;
        }
回复 支持 反对

使用道具 举报

49

主题

3751

帖子

1

精华

顶级版主

Rank: 11Rank: 11Rank: 11Rank: 11

积分
27948

资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章技术大牛奖章

威望
10632
贡献
10964
兑换币
4564
注册时间
2010-11-23
在线时间
3176 小时
5#
发表于 2012-3-13 00:39:12 | 只看该作者
这种长长的代码没人愿意帮你看的。

看文档又不是四级考试,下个翻译软件不就可以了。
这个东西看多了就算看见个别不认识的也能顺理成章的理解下去。

别看见那一千多页的文档就害怕。真正有用的信息很少。
回复 支持 反对

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
威望
159
贡献
35
兑换币
0
注册时间
2012-3-12
在线时间
11 小时
6#
 楼主| 发表于 2012-3-13 00:43:33 | 只看该作者
turf456 发表于 2012-3-13 00:39
这种长长的代码没人愿意帮你看的。

看文档又不是四级考试,下个翻译软件不就可以了。

我有这个MC9S12XS256RMV1.pdf
英文版的。把这个看完么?
我有个学长让我去买本书看XS单片机...
我该怎么做呢?
谢谢斑竹了。
回复 支持 反对

使用道具 举报

49

主题

3751

帖子

1

精华

顶级版主

Rank: 11Rank: 11Rank: 11Rank: 11

积分
27948

资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章技术大牛奖章

威望
10632
贡献
10964
兑换币
4564
注册时间
2010-11-23
在线时间
3176 小时
7#
发表于 2012-3-13 00:55:10 | 只看该作者
我是小菜鸟! 发表于 2012-3-13 00:43
我有这个MC9S12XS256RMV1.pdf
英文版的。把这个看完么?
我有个学长让我去买本书看XS单片机...

没让你看完啊。这个不是有目录么,需要什么看哪部分。
回复 支持 反对

使用道具 举报

3

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
威望
159
贡献
35
兑换币
0
注册时间
2012-3-12
在线时间
11 小时
8#
 楼主| 发表于 2012-3-13 01:07:44 | 只看该作者
turf456 发表于 2012-3-13 00:55
没让你看完啊。这个不是有目录么,需要什么看哪部分。

哦哦。知道了。谢谢了。
版主,晚安。
回复 支持 反对

使用道具 举报

137

主题

2197

帖子

1

精华

知名人物

广州穗佳电子科技有限公司飞思卡尔专业店

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
23283

特殊贡献奖章资源大师奖章优秀版主奖章热心会员奖章论坛元老奖章活跃会员奖章优秀会员奖章在线王奖章论坛骨干奖章

QQ
威望
6807
贡献
12964
兑换币
9459
注册时间
2011-6-24
在线时间
1756 小时
9#
发表于 2012-3-13 07:30:10 | 只看该作者
这跟四级没过没啥关系
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1765
威望
1022
贡献
305
兑换币
18
注册时间
2011-2-7
在线时间
219 小时
10#
发表于 2012-3-13 09:20:15 | 只看该作者
买书也是翻译技术文档的,好好锻炼下吧
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 22:04 , Processed in 0.206160 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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