智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3590|回复: 12
打印 上一主题 下一主题

[编程类] 继续求救~~~已经出来雏形了,大家帮忙啊

[复制链接]

8

主题

306

帖子

0

精华

高级会员

Rank: 4

积分
806

优秀会员奖章

QQ
威望
565
贡献
191
兑换币
0
注册时间
2010-1-10
在线时间
25 小时
跳转到指定楼层
1#
发表于 2010-1-11 12:15:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
搞了一个晚上,还是搞不掂...

// PLL初始化子程序   BUS Clock=40M
void setbusclock(void)
{   
    CLKSEL=0X00;    //disengage PLL to system                  //这里是不是指使用外部晶振?
    PLLCTL_PLLON=1;   //turn on PLL
    SYNR=4;         
    REFDV=1;          //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;  //osc是多少?
    _asm(nop);          //BUS CLOCK=40M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;          //engage PLL to system;
}
//PWM
void InitPWM(void)
{
    PWME=0x00;//PWM输出禁止
    PWMCTL=0xf0;//高八位置1,PWM通道级连,PWM1、PWM3、PWM5、PWM7为对应16bPWM输出
    PWMPOL=0xaa;//对应通道输出
    PWMCAE=0x00;//输出波形左对齐,即从周期原点开始计时
   
    PWMPRCLK=0x44;//预分频  CLOCKA=40MHZ/16=2.5MHZ,CLOCKB=40MHZ/16=2.5MHZ
   
    PWMSCLA=0x64;//CLOCKSA=CLOCKA/(2*100)=12.5kHZ
    PWMSCLB=0x64;//CLOCKSB=CLOCKB/(2*100)=12.5kHZ
    //0,1要求是100hz,则输出频率=时钟频率/(x+1)=100hz,得x=124,换成16进制0x7c
    PWMPER1=0x7c;
    //3,5要求是10khz,得x=249,即0xF9,7不做要求
    PWMPER3=0xF9;
    PWMPER5=0xF9;
    PWMCLK=0x82;//PWM1选择CLOCKSA,PWM5选择CLOCKA,PWM3选择CLOCKB,PWM7选择CLOCKSB        
    PWME=0x2a;//1,3,5输出使能
    PACTL=0x50;// 脉冲累加器使能,事件计数模式,上升沿计数,中断禁止      //此处,使能16位脉冲累加器,对PT7口计数.不知道该怎么写

//实时中断RTI
//------------------------------------------------------------
void InitRTI(void)
{
    RTICTL=0x6c;   //时间T=(1/40MHZ)*(12.5*2^15)=10.24ms,12.5取13,所以得T=10.64ms   //这里能否做到精确地10.24ms?
    CRGINT=0x80;    //开实时中断
}



//模数计数器
void SetMDC(void)
{
      //启用模数计数器,并实现自定义的时钟变量1s自增1.   这个也不怎么懂~~~~大虾们打救
}

这个是要求
1.将总线时钟(BUSCLOCK)设置为40M.
2.PWM
输出使能。通道01级联,频率100hz
通道23级联,频率10khz

通道45级联,频率10khz

3.
使能16位脉冲累加器,对PT7口计数.

4.
启用实时中断RTI,设置周期为10.24ms

5.
启用模数计数器,并实现自定义的时钟变量1s自增1.

说明:最好每一段程序都注释上自己的理解,尽量实现上述功能

8

主题

306

帖子

0

精华

高级会员

Rank: 4

积分
806

优秀会员奖章

QQ
威望
565
贡献
191
兑换币
0
注册时间
2010-1-10
在线时间
25 小时
2#
 楼主| 发表于 2010-1-11 12:17:37 | 只看该作者
先拿张沙发.
我觉得这个如果写好了,是个很好的入门例程.申请专利?
回复

使用道具 举报

14

主题

586

帖子

0

精华

禁止发言

事人

积分
3226
威望
988
贡献
1966
兑换币
62
注册时间
2008-9-5
在线时间
136 小时
3#
发表于 2010-1-11 12:54:34 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

8

主题

306

帖子

0

精华

高级会员

Rank: 4

积分
806

优秀会员奖章

QQ
威望
565
贡献
191
兑换币
0
注册时间
2010-1-10
在线时间
25 小时
4#
 楼主| 发表于 2010-1-11 18:50:45 | 只看该作者
唉,其实这个只是个学院选拔的题目而已,不是实际应用的.实际中超到40M的很少
回复

使用道具 举报

8

主题

306

帖子

0

精华

高级会员

Rank: 4

积分
806

优秀会员奖章

QQ
威望
565
贡献
191
兑换币
0
注册时间
2010-1-10
在线时间
25 小时
5#
 楼主| 发表于 2010-1-11 18:50:55 | 只看该作者
唉,其实这个只是个学院选拔的题目而已,不是实际应用的.实际中超到40M的很少
回复

使用道具 举报

8

主题

306

帖子

0

精华

高级会员

Rank: 4

积分
806

优秀会员奖章

QQ
威望
565
贡献
191
兑换币
0
注册时间
2010-1-10
在线时间
25 小时
6#
 楼主| 发表于 2010-1-11 18:51:39 | 只看该作者
没有人解答吗...痛苦ing,明天考英语啊,今晚不能再搞这个了
回复

使用道具 举报

13

主题

176

帖子

0

精华

常驻嘉宾

宝塔镇河妖

Rank: 8Rank: 8

积分
3622

活跃会员奖章

QQ
威望
832
贡献
2416
兑换币
258
注册时间
2009-1-23
在线时间
187 小时
7#
发表于 2010-1-11 19:24:49 | 只看该作者
40M我还嫌低了呢,今年用xs128MAA,能到80M,总线频率当然要高点好,反正其它地方可以分频得到。。。

bus clock=pll clock/2
pllclock=2*osc*(1+SYNR)/(1+REFDV)
osc是源晶振,一般都是16M。

精确地10.24ms? T=(1/40MHZ)*(12.5*2^15)=10.24ms 把12.5*2^15换算成16进制就行了,注释没看么。

//启用模数计数器,并实现自定义的时钟变量1s自增1 ,这个是根把你的总线时钟频率才能确定寄存器的初始化的。
回复

使用道具 举报

8

主题

306

帖子

0

精华

高级会员

Rank: 4

积分
806

优秀会员奖章

QQ
威望
565
贡献
191
兑换币
0
注册时间
2010-1-10
在线时间
25 小时
8#
 楼主| 发表于 2010-1-11 19:44:12 | 只看该作者
那个注释是我加的...  12.5换不成16进制啊...  我是把12.5取为13的


//启用模数计数器,并实现自定义的时钟变量1s自增1 ,这个是根把你的总线时钟频率才能确定寄存器的初始化的     关于这个,有具体的程序嘛
回复

使用道具 举报

13

主题

176

帖子

0

精华

常驻嘉宾

宝塔镇河妖

Rank: 8Rank: 8

积分
3622

活跃会员奖章

QQ
威望
832
贡献
2416
兑换币
258
注册时间
2009-1-23
在线时间
187 小时
9#
发表于 2010-1-11 20:27:47 | 只看该作者
RTI一般都只是三秒后启动车才用,还是一次性的定时中断。
回复

使用道具 举报

13

主题

176

帖子

0

精华

常驻嘉宾

宝塔镇河妖

Rank: 8Rank: 8

积分
3622

活跃会员奖章

QQ
威望
832
贡献
2416
兑换币
258
注册时间
2009-1-23
在线时间
187 小时
10#
发表于 2010-1-11 20:53:14 | 只看该作者
PT7一般用作车速的反馈脉冲捕捉,你也可以理解为51里面的外部中断,只是PT port功能要更多一点。

PACTL=0x50;// 脉冲累加器使能,事件计数模式,上升沿计数,中断禁止

上面这句就是起用PT7了,方式都写得很清楚了,这个不用中断就行的。

查询方式就行了,中断多行了会影响传感器的采集。

看你的编码器是怎么输出的,有些是编码器转一圈,输出一个信号。

反正只要来一个高电平,它就加1.因为是上升沿计数嘛。

你要读数呢,就从PACNT里读,比如newSpeedCnt=PACNT,就行了,方便吧。

再算算你的编码器和电机的齿轮比例,就能大概算出小车当前的转速了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-20 19:46 , Processed in 0.051597 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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