智能车制作
标题:
编码器测速问题
[打印本页]
作者:
智能.卓越
时间:
2013-10-31 21:08
标题:
编码器测速问题
这是一段卖家给的测速程序,试了好多次都是没有结果,求大神帮我看看给点建议,我不太会改,只能勉强看懂。
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define PUPAE 0
/*void 1(unsigned int m)
{
unsigned char base=0xff;
for(;m;m--)
{
for(base=0xff;base;base--);
}
}*/
volatile int back_speed_left = 0,back_speed_right = 0 ;
void intchu()
{
DDRA = 0x00; //输入
PUCR|=(1<<PUPAE);
DDRB |= 0X01 ;//输出
PORTB &=0XFE;
}
void inticlock()
{ //倍到40 正常16/2
SYNR=0x44;
REFDV=0x81;
POSTDIV=0x00;
while(CRGFLG_LOCK!=1);
CLKSEL_PLLSEL=1;
}
//串口初始化
void SCIInt(void){
char temp;
//SCI0BDH = 0x01;
//SCI0BDL = 0x05;
SCI0BDL = 0x16;//设置波特率为115200
SCI0BDH = 0x00;
SCI0CR1_M = 0; //数据位8位 停止位一位
SCI0CR1_PE = 0; //无奇偶校验
temp = SCI0DRL; //把寄存器清空,准备发数据到上位机
temp = SCI0DRH;
//SCI0CR2 = 0x2c; //发送允许
SCI0CR2 = 0x2c; //两个一起发 发送允许 接收中断允许
}
void send(uchar a)
{
while(!SCI0SR1_TDRE);
SCI0DRL=a;
SCI0DRH=0x00;
}
void sendInt(int num)
{
char dat_h,dat_l;
dat_l=(uchar)(num);//低字节直接赋值 高位舍去
dat_h=(uchar)(num>>8); //拆分高字节
send(dat_h);
send(dat_l);
}
/* 初始化计数器模块(TIM - Timer Module) *
* PT7:用于测速(捕捉脉冲的上升沿) */
void Init_TIM(void)
{
DDRT&=~(1<<7);
PERT|=(1<<7);//编码器脉冲累加器口为输入,上拉有效。其他口没作用。
PACTL = 0x40; // 使能累加器
PACNT = 0x0000; // 累加器清零
}
/*void Init_CD4520(void)
{
PT0AD0 = 0;
ATD0DIEN=0xff00; //ATD输入使能
DDR0AD0 = 0x00; //用AD复用的IO口高八位 设置为输入
DDR1AD0_DDR1AD06 = 1; //
PT1AD0_PT1AD06 = 1;
asm(nop);
asm(nop);
PT1AD0_PT1AD06 = 0;
asm(nop);
asm(nop);
} */
void Init_CD4520(void)
{
PORTB |= 0x01;
asm(nop);
asm(nop);
asm(nop);
asm(nop);
asm(nop);
asm(nop);
asm(nop);
asm(nop);
PORTB &=0XFE;
}
// 时钟模块 输出比较。。。。
void intTime_OUTPUT(void){
TIOS_IOS1 = 1; //选择输出比较方向为output
//TCTL4_EDG1B = 0 ; //选择扑捉形式 上升沿
//TCTL4_EDG1A = 1 ;
TSCR2_PR2 = 0 ; //预分频到5兆
TSCR2_PR1 = 1 ;
TSCR2_PR0 = 1 ;
TC1 = 25000; //要比较的数
TIE_C1I = 1; //时钟使能
TSCR1_TEN = 1 ; //整个时钟使能
}
void main(void) {
intchu();
inticlock();
SCIInt();
Init_TIM();
Init_CD4520();
intTime_OUTPUT();
EnableInterrupts;
for(;;) {
}
}
volatile int count = 0;
#pragma CODE_SEG __NEAR_SEG NON_BANKED
#pragma TRAP_PROC
void Interrupts()
{
TFLG1_C1F=1;//接受中断信号
TC1+=25000;
count++;
if(count >= 500)
{
count=0;
back_speed_left = PORTA;
back_speed_right = PACNT;
sendInt(back_speed_left);
sendInt(back_speed_right);
PORTB |= 0x01;
asm(nop);
asm(nop);
asm(nop);
asm(nop);
asm(nop);
asm(nop);
asm(nop);
asm(nop);
PORTB &=0XFE;
PACNT = 0;
}
}
#pragma CODE_SEG DEFAULT
作者:
飞鸿印雪
时间:
2013-10-31 21:36
自己写吧 不难的
作者:
天河之外
时间:
2013-12-19 12:28
作者:
moxiaoran
时间:
2014-1-12 18:23
作者:
小布的梦
时间:
2014-1-12 22:17
:lol:lol:lol:lol:lol
作者:
jamesZB
时间:
2014-3-29 10:32
你的cd4520在哪买的,几个引脚?
作者:
思源
时间:
2014-7-8 01:23
CD4520的程序块中,没有对芯片进行使能。
void Init_CD4520(void)
{
//PORTA = 0xff;
//DDRA = 0x00; //输入//***********************加上也行一样PORTA = 0xff;DDRA = 0x00;
DDRE_DDRE3 = 1;
PORTE_PE3= 1;
asm(nop);
asm(nop);
PORTE_PE3= 0;
asm(nop);
asm(nop);
}
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2