智能车制作
标题:
用“输出比较+脉冲累加器”测风扇的转速,将转速在数码管上显示;忘指出错误,谢谢!
[打印本页]
作者:
伤痕我心
时间:
2013-8-31 18:44
标题:
用“输出比较+脉冲累加器”测风扇的转速,将转速在数码管上显示;忘指出错误,谢谢!
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
//***********************
//输入信号的频率测量***** 利用脉冲累加器在单位时间内对脉冲计数,用输出比较来定时
//***********************
unsigned int m = 0,a=0,n=0;
const byte LedData[18] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0xce,0x6e} ;
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F P H */
const byte Error[5] = {0xee,0xfc,0xee,0xee,0x9e};
void spiDELAY(void)
{
unsigned int loop_i;
for (loop_i=0; loop_i< 50; loop_i++)
{
;
}
}
void spiWRITEbyte(unsigned int spiDATA){
unsigned int i =0;
for(i;i<8;i++){
PTP_PTP2 =0;
spiDELAY();
if(spiDATA%2){
PTP_PTP1=1;
}
else {
PTP_PTP1=0;
}
spiDELAY();
spiDATA = spiDATA/2;
PTP_PTP2 = 1;
spiDELAY();
}
PTP_PTP2 = 1;
}
void ledCONTROL(dword displayDATA){
unsigned int spiBYTE01,spiBYTE02,spiBYTE03,spiBYTE04,spiBYTE05;
spiBYTE05 = displayDATA /10000 ; //得到万位
spiBYTE04 = displayDATA /1000 - displayDATA /10000 *10 ; //获得千位
spiBYTE03 = displayDATA /100 - displayDATA /1000 *10 ; //获得百位
spiBYTE02 = displayDATA /10 - displayDATA /100 *10 ; //获得个位
spiBYTE01 = displayDATA % 10 ; //获得个位
// spiWRITEbyte(spiDATA);
spiWRITEbyte(LedData[spiBYTE01]);
spiWRITEbyte(LedData[spiBYTE02]);
spiWRITEbyte(LedData[spiBYTE03]);
spiWRITEbyte(LedData[spiBYTE04]);
spiWRITEbyte(LedData[spiBYTE05]);
}
void PLL_Init(void)
{
REFDV=0;
SYNR=4;
while(!(CRGFLG && 0x08));
CLKSEL=0x80; //****20MHZ
}
void ECT0_Init(void)
{ //***设置输出比较
TIOS=0x01;
TC0=0xFE;
TCTL1=0x00;
// OC7M = 0xFE;
TCTL2=0x02;
TSCR2=0x06;
TSCR1=0x80;
TIE=0x01;
//***脉冲累加器的设置
PACTL = 0x50;
}
/* static void IOC_Init(void)
{
PACTL=0x50;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
// PACNT = 0x00;
TCTL3=0xc0;//c-输入捕捉7任何沿有效,
TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿
TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断
TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
}
*/
void PWM_Init(void)
{
PWMPOL = 0X20;
PWMCAE = 0X20;
PWMCLK = 0X20;
PWMPRCLK = 0X00;
PWMSCLA = 0X80;
PWMCTL = 0X00;
PWMPER5 = 128;
PWMDTY5 = 30;
PWME = 0X20;
}
void main(void) {
/* put your own code here */
unsigned char i,spiDATA,spiLENGTH;
DDRP_DDRP1 =1;
DDRP_DDRP2 =1;
DDRK_BIT1 =1;
PORTK_BIT1 =1;
PTP_PTP1 =0;
PTP_PTP2 =0;
PTT_PTT0 =1;
spiDATA = 0XFC;
spiLENGTH = 8;
for(i=0;i<6;i++)
{
spiWRITEbyte(spiDATA);
}
PLL_Init();
// IOC_Init();
ECT0_Init();
PWM_Init();
EnableInterrupts;
for(;;) {
_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
#pragma CODE_SEG NON_BANKED
void interrupt 8 timer0_ISR(void)
{
TFLG1_C0F=1;
m=TCNT;
TC0=m+15625 ; //定时50ms
n++;
if(n==20) //1s
{
a=PACN32;
PAFLG_PAOVF = 1 ;
a = a/334;
ledCONTROL(1000);
// PACN32 = 0x00;
n=0;
}
}
#pragma CODE_SEG DEFAULF
作者:
伤痕我心
时间:
2013-8-31 18:46
其中的PTT_PTT0=1;是PT0这个IO口,用于测速的引脚
作者:
凌心
时间:
2013-8-31 18:49
你直接丢出来一堆代码没几个人会去看的,再说了,即使看了,没有环境也无法调试。
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2