编码器采集程序 下载本文

/*************************************************************** 总线频率88M,PWM频率250HZ,定时器每0.1s去查看脉冲累加器的值 然后将脉冲数反映到端口B的LED上。

***************************************************************/ #include #include \

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