完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
欧姆龙编码器(型号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("%dtcntrn",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("|%drn",angle); } }
|
|
相关推荐
2个回答
|
|
学习学习。。。。
|
|
|
|
我记得当时用欧姆龙编码器的时候,波形不稳定,加了上拉电阻之后就是预想的效果
|
|
|
|
只有小组成员才能发言,加入小组>>
3032个成员聚集在这个小组
加入小组2923 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3594 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2341 浏览 1 评论
4800 浏览 1 评论
2573 浏览 1 评论
1327浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3600浏览 2评论
2928浏览 1评论
1510浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 20:05 , Processed in 1.146160 second(s), Total 52, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号