智能车制作
标题: 急急急急急急急急急急急!!新手求助!!!!!!大虾们快来看看啊!!!!! [打印本页]
作者: longforljy 时间: 2010-1-10 12:30
标题: 急急急急急急急急急急急!!新手求助!!!!!!大虾们快来看看啊!!!!!
硬件平台:MC9S12XS128 80脚QFP封装
软件平台:codewarrier v4.7以上版本
要求:
1.将总线时钟(BUSCLOCK)设置为40M.
2.PWM输出使能。通道0,1级联,频率100hz;
通道2,3级联,频率10khz;
通道4,5级联,频率10khz;
3.使能16位脉冲累加器,对PT7口计数.
4.启用实时中断RTI,设置周期为10.24ms
5.启用模数计数器,并实现自定义的时钟变量1s自增1.
说明:最好每一段程序都注释上自己的理解,尽量实现上述功能。
这个是要求.先说明,并不是我想偷懒或者取巧.由于1月10号,就是今天要交了,实在没办法.有人会问之前我忙什么去了.这里我再解释一下,因为之前第一次使用51系列的单片机参加了学院的一次小车比赛,而比赛是在1月2号,我很认真的完成了这次比赛,并获得了好成绩.之后1月2号到现在都是忙着期末考试啦.学院实在是太没人性了,希望大虾们帮帮忙啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我考完事后一定会认真学习这款单片机的,我不会浪费大虾们的帮助的!!!谢谢了
作者: lim1t 时间: 2010-1-10 12:30
- void InitBusCLK_40M(void)
- {
- CLKSEL=0X00; //disengage PLL to system
- PLLCTL_PLLON=1; //turn on PLL
- SYNR =0xc0 | 0x04;
- REFDV=0xc0 | 0x01;
- POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
- _asm(nop); //BUS CLOCK=pll clock/2=40M
- _asm(nop);
- while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
- CLKSEL_PLLSEL =1; //engage PLL to system;
- }
- void InitPWM(void){
- PWME=0x00;//PWM禁止
- PWMCTL=0xf0;//PWM通道级连,PWM1、PWM3、PWM5、PWM7为对应16bPWM输出
- PWMPOL=0xaa;//对应通道输出
- PWMCAE=0x00;//输出波形左对齐
- PWMPRCLK=0x21;//CLOCKA=40MHZ/2=20MHZ,CLOCKB=40MHZ/4=10MHZ
- PWMSCLB=0x5;//CLOCKSB=CLOCKB/(2*5)=1MHZ
- PWMCLK=0x08;//PWM1、PWM5选择CLOCKA,PWM3选择CLOCKSB,PWM7选择CLOCKB
- PWMPER01=MotorCyc;// 马达PWM周期
- PWMPER45=MotorCyc;// 马达PWM周期
- PWMPER23=RudderCyc;//舵机PWM周期
- //设置马达初始空比,实时占空比由速度控制函数输出设置
- PWMDTY01=0; //MotorOUT1;
- PWMDTY45=0; //MotorOUT2;
- //设置舵机初始占空比,舵机摆正,实时占空比由方向控制函数输出设置
- PWMDTY23=MiddleAngle;
- //PWMSDN=0x00;//PWM紧急关段初始设置
- PWME_PWME1=0;//PWM1通道使能
- PWME_PWME5=0;//PWM5通道使能
- PWME_PWME3=1;//PWM3通道使能
- }
- //-----------------------------------------------------------
- //脉冲累加器初始化函数,测速编码输入到PT7**
- //-----------------------------------------------------------
- void InitPulesA(void){
- PACTL=0x50;// 脉冲累加器使能,事件计数模式,上升沿计数,中断禁止
- }
- //------------------------------------------------------------
- //初始化实时中断RTI,时间T=100MS,F=16MHZ/(1.6*10^6)
- //------------------------------------------------------------
- void InitRTI(void) {
- RTICTL=0xef;
- CRGINT_RTIE=1;
- }
- void MDCInit()
- {
- MCCTL = MCCTL&0xfb;//模数计数器禁止运行
- MCCTL = 0xe1; //允许中断,模数计数方式 分频常数为4
- MCCTL = MCCTL|0X04;
- MCCNT = 25*nF; //(1/25M)*100*nF =4us*nF
- MCCTL = MCCTL|0x08 ; //把模数常数寄存器的值加载到模数计数器FLMC;
- }
复制代码 都是自己用的,有点乱,跟你要求的有点出入,不过修改下应该能用的。
另外提醒下,PWM做初始化的时候,几个通道的clock不一定相同的。
bus clock、clockA、clockB、clocksB,所以级联的时候要考虑好。
作者: shangshu 时间: 2010-1-10 15:04
作者: lim1t 时间: 2010-1-10 15:16
回复 3# shangshu
哈哈哈,shangshu你知不知道这样有灌水的嫌疑。。。
作者: xinxinms 时间: 2010-1-10 15:21
LZ作弊。。。
作者: shangshu 时间: 2010-1-10 15:22
如果这样有嫌疑的话,就把表情取消了撒。表情也代表一种想法。
作者: lim1t 时间: 2010-1-10 15:28
你的板子测试得如何了。能用不。
作者: longforljy 时间: 2010-1-10 19:46
晕...怎么直接点别人回复框下面的回复按钮回复的时候,看不见的....哪里去了
作者: longforljy 时间: 2010-1-10 19:47
话说这个悬赏怎么给的?...
作者: longforljy 时间: 2010-1-10 19:49
今天晚上有空的话我想还是得自己看看,稍微修改下源代码...要不肯定一下子就被揭穿
作者: lim1t 时间: 2010-1-10 20:16
其实初始化代码都是差不多的,搞懂寄存器的作用和奏效就行了,同学加油。
作者: lxiongh 时间: 2010-1-10 20:57
已经揭穿
作者: xinxinms 时间: 2010-1-10 21:03
揭穿+1
作者: longforljy 时间: 2010-1-11 00:48
努力ing
作者: longforljy 时间: 2010-1-11 02:43
搞了一个晚上,还是搞不掂...
// 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;
_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
CRGINT=0x80; //开实时中断
}
//模数计数器
void SetMDC(void)
{
//启用模数计数器,并实现自定义的时钟变量1s自增1. 这个也不怎么懂~~~~大虾们打救
}
作者: longforljy 时间: 2010-1-11 02:44
1.将总线时钟(BUSCLOCK)设置为40M.
2.PWM输出使能。通道0,1级联,频率100hz;
通道2,3级联,频率10khz;
通道4,5级联,频率10khz;
3.使能16位脉冲累加器,对PT7口计数.
4.启用实时中断RTI,设置周期为10.24ms
5.启用模数计数器,并实现自定义的时钟变量1s自增1.
这是要求,补充下
不行了,睡觉哩
作者: 法拉利 时间: 2010-1-11 12:17
参考参考。。。
作者: DEMOK 时间: 2010-1-13 20:57
学习了
作者: yuan 时间: 2010-1-16 13:00
void MDCInit()
{
MCCTL = MCCTL&0xfb;//模数计数器禁止运行
MCCTL = 0xe1; //允许中断,模数计数方式 分频常数为4
MCCTL = MCCTL|0X04;
MCCNT = 25*nF; //(1/25M)*100*nF =4us*nF
MCCTL = MCCTL|0x08 ; //把模数常数寄存器的值加载到模数计数器FLMC;
}
错了,XS128中不适用
作者: bullybully 时间: 2010-3-16 21:52
谢谢
作者: xiaohaipolang 时间: 2010-3-20 11:51
作者: zczc003 时间: 2010-4-23 21:04
good
作者: sunnylee 时间: 2010-4-24 14:28
看看
作者: kangluoyi 时间: 2010-4-24 15:29
yuuu
作者: 4819142 时间: 2011-3-29 12:08
学习了
作者: wandsq 时间: 2011-3-29 21:52
vb g
欢迎光临 智能车制作 (http://111.231.132.190/) |
Powered by Discuz! X3.2 |