智能车制作
标题: 请大家帮忙看看我的测速程序为什么没有返回值呢 [打印本页]
作者: 黄河浪 时间: 2012-3-28 10:14
标题: 请大家帮忙看看我的测速程序为什么没有返回值呢
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
//程序中用到的函数申明_WNL
void delay_1MS(int ms);//延时1ms程序
void SET_PLL(void);//锁相环程序_WNL
void SCI_Init();
void Uart_putchar( unsigned char c);
void Uart_putstr(char ch[]);
unsigned char Uart_getchar(void);
void PWM_Init(void);//PWM初始化
void OverCounter(void);//自由运行计数器溢出中断
void Speed_catch(void);//TC7输入捕捉中断
void Speed_Init(void);//速度采集初始化
void Initialize_RTI(void);//实时中断初始化
void RTI_Init(void);//RTI中断
//程序中用到的变量申明_WNL
byte res=0;
unsigned char Time=0;//自由运行计数器溢出次数
unsigned char Timefirst=0;
unsigned int Speed=0,Speed1=0,Speed2=0;//前后三次的速度
unsigned int trianglespeed=0;
unsigned int Speedc=0,Speedd;//Speedc记录上升沿来临的次数,Speedd记录总的时间
unsigned int TimeCnt1=0,TimeCnt0=0;//记录前后两次自由计数器中的值
unsigned char timecounter=0;//记录系统的时间_WNL
unsigned char time=0;
int Speedbase=0;//速度给定值的整体调控
/**************延时程序***********************/
void delay_1MS(int ms)
{
intii,jj;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<1325;jj++);
}
/*****************锁相环程序*****************/
void SET_PLL(void)
{ //设置锁相环时钟频率为48M
SYNR=2;
REFDV=1; //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
asmNOP;
asmNOP;
asmNOP;
while((CRGFLG&0X08)==0);//等待锁相环频率锁定
CLKSEL=0X80; //选定锁相环时钟
}
/*初始化SCI0*/
void SCI_Init()
{
SCI0BD=313;//48MHz总线频率,9600的分频SCI系数,波特率=总线时钟/(16×SCIxBD);
SCI0CR1 =0x00;//正常8位模式,偶校验
SCI0CR2 =0x2c;//接收中断允许
}
void Uart_putchar ( unsigned char c)
{
while(!(SCI0SR1&0x80)) ; //keep waitingwhen not empty
SCI0DRL=c;
}
void Uart_putstr(char ch[])
{
unsigned char ptr=0;
while(ch[ptr]){
Uart_putchar((unsigned char)ch[ptr++]);}
}
unsigned char Uart_getchar(void)
{
byte res=0;
while(!(SCI0SR1&0x80)) ; //keep waitingwhen not empty
return (SCI0DRL);
}
/****************实时中断初始化程序*************/
void Initialize_RTI(void)
{
CRGINT_RTIE=1;//实时中断使能
RTICTL=0X54;//实时中断周期为5.12ms
EnableInterrupts;//清除I屏蔽位
}
/****************中断服务程序*******************/
#pragma CODE_SEG NON_BANKED//指示该程序在不分页区
#pragma TRAP_PROC
void RTI_Init(void)
{
CRGFLG_RTIF = 1;
AD_detect(); //调用AD转换处理程序
asmNOP;
asmNOP;
asmNOP;
//记录系统时间_WNL
timecounter++;
if(timecounter>=200)
{
timecounter=0;
time++;
}
if(time>200)time=0;
}
#pragma CODE_SEG DEFAULT
/****************************速度检测初始化*************************/
void Speed_Init(void)
{
asm sei;
TIOS=0x00; //通道2设置为输入捕捉
TIE=0xFF; //通道1输入捕捉中断使能
TCTL3_EDG7B=0;
TCTL3_EDG7A=1; //通道2捕捉上升沿
TSCR2_TCRE=0; //自由运行计数器禁止复位
TSCR1_TFFCA=0; //定时器标志普通清除方式
TSCR2_TOI=1; //定时器溢出中断
TSCR2_PR=0x02; //
TSCR1_TEN=1; //定时器使能
EnableInterrupts;
}
/********************检测自由运行计数器溢出次数*******************/
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void OverCounter(void)
{
TFLG2_TOF=1;//清除溢出标志位
Time++; //自由运行计数器溢出,计数值加1
}
#pragma CODE_SEG DEFAULT
/*********************进行速度采集********************************/
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void Speed_catch(void)
{
TFLG1_C7F=1; //清除中断标志位
if(Speedc==0)
{//第一次进入
Timefirst=Time;//记录自由运行计数器溢出次数
TimeCnt0=TC7;//记录当前自由运行计数器中的值
Speedc=1; //已经有第一次进入做基础,准备第二次进入
}
else if(Speedc==1)
{
TimeCnt1=TC7;//记录当前自由运行计数器的值
Speedd=(Time-Timefirst)*65535-TimeCnt0+TimeCnt1;//记录总的时间
Speed=(uint)(197476/Speedd);//求当前瞬时速度
Speed=(Speed+Speed1+Speed2)/3;//取三次速度的平均值
Speed2=Speed1;
Speed1=Speed;//速度跟新
Speedc=0;
Time=0;//标志位清0
}
}
#pragma CODE_SEG DEFAULT
/*****************PWM初始化程序***************/
void PWM_Init(void)
{
PWME=0X00;//关闭所有PWM输出
PWMPRCLK=0X22;//24M/4=6M
PWMSCLA=0X06; //6M/(2*6)=0.5M
PWMSCLB=0X03; //6M/(2*3)=1M
PWMCTL=0X20; //通道2和通道2合并
PWMCLK=0X3C; //通道23,4,5选择clocksA
PWMPOL=0X3C; //PWM先输出高电平
PWMCAE=0X00; //左对齐
PWMPER23=10000;//周期为10ms
PWMDTY23=1500;//输出角度为0度
PWMPER4 = 100; //5KHz
PWMPER5 = 100; //5KHz
PWMDTY4 =30;//初始速度设置为0
PWMDTY5 =0;
PWME=0X3C;//开启PWM23,PWM4,PWM5
}
void main(void)
{
delay_1MS(2000);
DDRA=0X00;
SET_PLL();
PWM_Init();
Initialize_RTI();
Speed_Init();
EnableInterrupts;
while(1)
{
PWMDTY4=20;
time=0;
timecounter=0;//计数器清零
if(Uart_getchar() == 'c')
Uart_putstr("Usart Is Working!");
}
/*please make sure that you never leave main */
}
作者: hahah 时间: 2013-1-17 16:07
楼主,我也遇到同样的问题,莫非自由计数器溢出中断不能开。TSCR2_TOI=1; //定时器溢出中断
一旦开了,就不能进入主程序了。搞不清楚是什么原因。。。TSCR2_TOI=0; //禁止定时器溢出中断
这样程序没有问题。。。。。。也大神解释这是什么原因。。。
作者: hahah 时间: 2013-1-17 20:03
TIE=0xFF; //通道1输入捕捉中断使能
只开有用的中断。其他的关掉。应该就可以了。 TIE=0x02; //通道1输入捕捉中断使能
欢迎光临 智能车制作 (http://dns.znczz.com/) |
Powered by Discuz! X3.2 |