智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8649|回复: 20
打印 上一主题 下一主题

[分享] 编码器采集程序

  [复制链接]

28

主题

166

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1649
威望
810
贡献
379
兑换币
404
注册时间
2012-10-11
在线时间
230 小时
毕业学校
山东理工大学
跳转到指定楼层
1#
发表于 2013-1-26 17:30:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天刚把编码器采集所需的PIT和TIM模块搞定,然后果断的分享了
/***************************************************************
  总线频率88M,PWM频率250HZ,定时器每0.1s去查看脉冲累加器的值
  然后将脉冲数反映到端口B的LED上。
***************************************************************/
#include <hidef.h>     
#include "derivative.h"     

void PA_init() {
     
    PACTL_PAEN=0;                      // 禁止脉冲累加功能
   
    PACTL_PAMOD=0;                     // 事件计数模式
    PACTL_PEDGE=0;                     // 下降沿触发计数
    PACTL_PAOVI=0;                     // 脉冲数据寄存器溢出中断关闭
    PACTL_PAI=0;                       // 脉冲输入中断关闭
    PACNT=0x0000;                      // 脉冲数据寄存器清零
   
    TCTL3|=0X40;                       // 通道7上升沿捕捉
    TIE=0X00;                          // 所有的通道寄存器没有使能
    TIOS_IOS7=0;                       // 通道7为输入捕捉
   
    PACTL_PAEN=1;                      // 脉冲计数允许
}
void SetBusCLK_88M(void)
{   
    CLKSEL=0X00;                    // disengage PLL to system
    PLLCTL_PLLON=1;                   // turn on PLL
    SYNR =0xc0 | 0x0a;                        
    REFDV=0x80 | 0x01;
    POSTDIV=0x00;                      // pllclock=2*osc*(1+SYNR)/(1+REFDV)=176MHz;
    _asm(nop);                         // BUS CLOCK=88M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));          // when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;                 // engage PLL to system;
}

void PIT_init() {
  
    PITCFLMT=0X00;                     // 禁用PIT模块
    PITCE|=0X01;                       // 定时器0通道使能位置1
    PITMUX_PMUX0=0;                    // 连接微定时器0与定时器0
    PITFLT|=0X01;                      // 定时器0强制装载位置1
      
    PITMTLD0=219;                      // 微定时器0装载寄存器    220
    PITLD0=39999;                      // 定时器0装载寄存器      40000
                                       // 220*40000/88000000=0.1s
    PITINTE|=0X01;                     // 允许定时器0中断使能
    PITTF|=0X01;                       // 定时器0中断标志位清零
     
    PITCFLMT=0X80;                     // 使能PIT模块
         
}
void PWM_init() {
    PWME_PWME5 = 0;                    // 先禁止各通道输出
    PWMCTL_CON45 = 1;                  // 通道45级联成16位PWM
   
    PWMPRCLK_PCKA = 2;                 // 预分频系数为A 2,总线频率,即22MHZ
    PWMSCLA = 1;                       // SA_CLK = A_CLK / (2*1) ==11MHz
    PWMCLK_PCLK5 = 1;                  // 通道选  clock SA做时钟源
                                             
    PWMCNT45=0;                        // 45计数器清零
    PWMCAE_CAE5=0;                     // 选择输出模式为左对齐输出模式   
    PWMPOL_PPOL5=1;                    // 先输出高电平,计数到DTY时,反转电平
   
    PWMPER45=44000;                    // PWM=11M/44000=250HZ,周期为4ms
    PWMDTY45=16500;                    // 初值设定为90度
     
    PWME_PWME5 = 1;
         
}
void main(void) {
   SetBusCLK_88M();                     // 时钟初始化
   PA_init();                           // 脉冲累加捕捉初始化
   PIT_init();                          // 定时器0初始化
   PWM_init();                          // PWM初始化
   DDRB=0XFF;                           //端口初始化
   EnableInterrupts;                    //开总中断

  for(;;) {  
  }
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0_ISR(void){   
  PACTL_PAEN=0;                          // 输入脉冲计数禁止
  PORTB=PACNT;
  PACNT=0X0000;                          // 脉冲数据寄存器清零
  PACTL_PAEN=1;                          // 输入计数允许
  PITTF_PTF0=1;                          // 清除PIT0的标记
}
#pragma CODE_SEG DEFUALT

14

主题

558

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3840

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

QQ
威望
1862
贡献
1042
兑换币
748
注册时间
2012-9-5
在线时间
468 小时
2#
发表于 2013-1-26 19:55:22 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
威望
84
贡献
36
兑换币
54
注册时间
2012-12-21
在线时间
56 小时
毕业学校
中国计量学院
3#
发表于 2013-1-29 21:02:47 | 只看该作者
果断顶起来
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
威望
84
贡献
36
兑换币
54
注册时间
2012-12-21
在线时间
56 小时
毕业学校
中国计量学院
4#
发表于 2013-1-29 21:04:36 | 只看该作者
楼主,总线频率能达到88MHz吗,貌似最多64MHz吧。。。
回复 支持 反对

使用道具 举报

28

主题

166

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1649
威望
810
贡献
379
兑换币
404
注册时间
2012-10-11
在线时间
230 小时
毕业学校
山东理工大学
5#
 楼主| 发表于 2013-1-29 22:39:51 | 只看该作者
datasheet上PLL最高频率是120M,也就是官方推荐的最高稳定频率是60M,可通过设定SYNR寄存器的值,是可以达到88M,甚至是96M的,我曾在88M下跑过这些程序,挺稳定的,96M就不行了。
回复 支持 反对

使用道具 举报

0

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
威望
260
贡献
126
兑换币
167
注册时间
2013-1-5
在线时间
39 小时
6#
发表于 2013-3-10 10:58:18 | 只看该作者
很好,顶一个
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

高级会员

Rank: 4

积分
629
威望
402
贡献
157
兑换币
122
注册时间
2012-9-25
在线时间
35 小时
7#
发表于 2013-3-14 19:40:22 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
威望
250
贡献
147
兑换币
152
注册时间
2012-12-5
在线时间
43 小时
毕业学校
实验中学
8#
发表于 2013-3-26 18:42:33 | 只看该作者
官方推荐的最高稳定频率是60M,,,我想问一下大神,,你们这些知识从官网哪看到的啊,,为什么我找不到啊,,程门立雪!
回复 支持 反对

使用道具 举报

28

主题

166

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1649
威望
810
贡献
379
兑换币
404
注册时间
2012-10-11
在线时间
230 小时
毕业学校
山东理工大学
9#
 楼主| 发表于 2013-3-26 19:20:50 | 只看该作者
买龙丘的最小系统,人家送的
回复 支持 反对

使用道具 举报

17

主题

240

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2743
威望
1279
贡献
832
兑换币
711
注册时间
2012-10-19
在线时间
316 小时
10#
发表于 2013-3-26 21:35:57 | 只看该作者
楼主太无私了   多谢:D:D
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-7 20:58 , Processed in 0.165028 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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