RPM sensor转速传感器程序终于弄出来,电路图加上程序弄了我一个月的时间,下面把代码个大家看看。测速范围为1-1000转permin。
#include "stm8s103f.h"
#include "math.h"
#define N 256
int *pdata;
int cunt=0;
int AD_buf[N];
double sum;
int flag;
void output(int data)
{/*数据处理和输出*/
volatile int average;
volatile int mid1;
volatile int mid2;
average=sum/256;
mid1=average+5;
mid2=average-5;
if(*pdata>mid1)
PA_ODR=0x08;
else if(*pdata<mid2)
PA_ODR=0x00;
sum=sum+data-*pdata;
pdata++;
if(pdata==(AD_buf+N))
pdata=AD_buf;
}
void filter(int data)
{/*第一次采满256个样*/
AD_buf[cunt++]=data;
sum+=data;
if(cunt==N)
{
pdata=AD_buf;
flag=1;
}
}
@far @interrupt void TIM1_UPD_OVF_IRQHandler (void)
{
volatile unsigned char j;
volatile int AD_Value;
TIM1_SR1 = 0x00;
ADC_CR1 |= 0x01; /*开启AD*/
j = 6;
while(j--) /*AD要等待7us重启*/
ADC_CR1 |= 0x01;
while(!(ADC_CSR & 0x80)); /*等待一次采样完成*/
AD_Value = ((((unsigned int)ADC_DRH)<<2)+ADC_DRL);
if(flag==1)
output(AD_Value);
else filter(AD_Value);
}
void CLK_Init(void)
{ /*时钟初始化*/
CLK_CKDIVR = 0x08;
}
void GPIO_Init(void)
{/*设置PA3口为数据输出口*/
PA_DDR = 0x08;
PA_CR1 = 0x08;
PA_CR2 = 0x00;
}
void ADC_Init(void)
{/*AD初始化*/
CLK_PCKENR2 |=0X8;
ADC_CR2 |= 0x00;
ADC_CR1 = 0x00;
ADC_CSR = 0x04;
ADC_TDRL = 0x20;
}
void TIM1_init(void)
{ /*定时器控制采样时间,一次采样时间为125us*/
TIM1_PSCRH = 0x00;
TIM1_PSCRL = 0xF9;
TIM1_ARRH = 0x00;
TIM1_ARRL = 0x01;
TIM1_CR1 = 0x01;
TIM1_IER = 0x01;
}
void main(void)
{ /*硬件初始化*/
_asm("sim");
CLK_Init();
GPIO_Init();
ADC_Init();
TIM1_init();
_asm("rim");
while(1)
{
}
}
这是本人第一次用STM8做的一个测转速的代码,大家互相学习一下。 |