欧姆龙编码器(型号E6B2-CWZ3E)接的msp430f149的IO P2.5引脚利用中断测速度
脚本如下:请教各位大神,中断应该如何修改,最终打印结果如下:
#include "config.h"
#define keyin (P1IN & 0x0f)
#define Num_of_Results 32
#define cir_radius 30
#define uchar unsigned char
#define tiMER_CNT_NUM 50
#define SPEED_CNT_NUM 200
#define SPEED_IN P2IN
#define SPEED_IO BIT5
#define SPEED_DIR P2DIR
#define SPEED_OUT P2OUT
uint16_t results[Num_of_Results]; //保存ADC转换结果的数组
uint32_t average;
uint8_t tcnt = 0; //ADC计数
uint8_t tcnt_ta=0; //TimerA计数
uint32_t circle_speed=0; //后轮转速
uint16_t angle;
uint16_t start,end,T,sum;
uint8_t overflow;
uint8_t ta_cnt=0; //脉冲计数
uint32_t temp_cnt=0; //临时计数
uint32_t down_temp_cnt=0; //低电平计数
uint32_t up_temp_cnt=0; //高电平计数
uint8_t down_cnt_flag =1;
void PutStr(uchar *str);
void PutChar(uchar txdata);
void Printf( uint8_t *Data,...);
int fputc(int ch,FILE *f);
void InitUART(void);
void delay2s(void);
char *itoa(int value, char *string, int radix);
void delay(void);
void Clock_Init();
void TimerA_Init();
void TimerA_Init(){
//TACTL = TASSEL0+TACLR; //SMCLK, 计数器清除
CCTL0 = CCIE;
CCR0= TIMER_CNT_NUM*1000; //配置定时值
TACTL = TASSEL_2 + MC_1;
}
void Clock_Init()
{
uint8_t i;
BCSCTL1&=~XT2OFF; //打开XT2振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do{
IFG1&=~OFIFG; //清楚振荡器错误标志
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待
IFG1&=~OFIFG;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timer_a0()
{
CCR0 += TIMER_CNT_NUM*1000;
temp_cnt++;
if(temp_cnt>SPEED_CNT_NUM){
temp_cnt=0;
down_temp_cnt=0;
}
if(!(SPEED_IN & SPEED_IO)){
down_temp_cnt++;
}else if(SPEED_IN & SPEED_IO){
}
}
/*
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查询
{ case 2: //捕获中断
if(CCTL1&CM0) //上升沿
{
ta_cnt++;
P2OUT ^= BIT1;
Printf("%dtcnt
",tcnt);
}
else if (CCTL1&CM1) //下降沿
{
}
break;
case 10: //定时器溢出中断
P2OUT ^= BIT1;
break; //溢出计数加1
default:break;
}
tcnt_ta++;
if(tcnt_ta==200)
{
tcnt_ta=0;
circle_speed=(2*314*cir_radius*ta_cnt*36);
ta_cnt=0;
}
}
*/
/*******************************************
函数名称:ADC12ISR
功 能:ADC中断服务函数,在这里用多次平均的
计算P6.0口的模拟电压数值
参 数:无
返回值 :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static uint8_t index = 0;
results[index++] = ADC12MEM0; // Move results
if(index == Num_of_Results)
{
/*
if(keyin != 0x0f)
{
delay();
if(keyin != 0x0f)
{
while(keyin != 0x0f);
P2OUT ^= BIT0;
//uart0发送ON
sendString("ON");
}
}
*/
delay();
uint8_t i;
average = 0;
for(i = 0; i < Num_of_Results; i++)
{
average += results;
}
average >>= 5; //除以32
index = 0;
tcnt++;
if(tcnt == 200) //主要是控制串口发送速度
{
LPM1_EXIT;
tcnt = 0;
}
}
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P2DIR |= BIT0;
P2OUT |= BIT0; //L8输出,熄灭 为1熄灭,为0点亮
P2DIR |= BIT1;
P2OUT |= BIT1;
Clock_Init();
TimerA_Init();
InitUART(); //调用初始化函数
Init_ADC();
_EINT();
while(1)
{
LPM1;
circle_speed=2*3.14*3.6*cir_radius*down_temp_cnt;
angle=(360*average)/3300;
Printf("%dkm/h",circle_speed);
delay();
Printf("|%d
",angle);
}
}
-
打印结果为什么不连续
-
-
BicycleDemo2.rar
449.74 KB, 下载次数: 0
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>