📄 ad.c
字号:
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <inttypes.h>
#include <pgmspace.h>
#include <avr/wdt.h>
//======================全局变量======================================
uint16_t ad0_result; //存放AD0转换结果
//******************************延时子程序*****************************************
void delay_us(uint16_t u) //延时2us左右,delay(240)=100us;
{
while(u)
{
u--;
}
}
// 延时nms
void delay_ms(uint16_t m)
{
uint16_t i;
for(i=0;i<m;i++)
{
delay_us(2400); //延时1ms
}
}
//延时ns
void delay_s(uint16_t n)
{
uint16_t j;
for(j=0;j<n;j++)
{
delay_ms(1000); //延时1s
}
}
//================================AD转换设置,并启动转换=========================
void AD0_SETTING_AND_START()
{
//Avcc作为基准电压源,AREF引脚外加滤波电容,通道0
ADMUX = 0x00;
//AD时钟的分频因子为128(AD转换频率为115.2k),启动AD转换
ADCSRA=0x87;
}
//=================================AD转换滤波====================================
// AD转换 采样10次 去首尾求平均滤波
void AD0_RESULT_FILTER(void)
{
uint8_t i,index1,index2,low;
uint16_t result_array[10],sum,temp=0x00;
float ad0_average;
//Avcc作为基准电压源,AREF引脚外加滤波电容,通道0
ADMUX=0x00;
for(i=0;i<10;i++)
{
//AD时钟的分频因子128
ADCSRA=0x87;
ADCSRA|=1<<ADSC;
loop_until_bit_is_set(ADCSRA,ADIF); //等待AD转换结束
ADCSRA=ADCSRA|(1<<ADIF);
low=ADCL;
temp=ADCH;
temp=temp<<8;
temp=temp+low;
result_array[i]=temp;//AD转换结果
ADCSRA=ADCSRA &(~(1<<ADEN));
delay_us(100);
}
index1=0;//最大数对应序号
index2=0;//最小数对应序号
for(i=0;i<10;i++)
{
if(result_array[i]>result_array[index1])
{
index1=i;
}
if(result_array[i]<result_array[index2])
{
index2=i;
}
}
sum=0;
for(i=0;i<10;i++)
{
if((i==index1)||(i==index2))
continue;
sum=sum+result_array[i];
}
if(index1==index2)
ad0_average=sum/9;
else
ad0_average=sum/8;
ad0_result=ad0_average;
}
//主程序
int main(void)
{ for(;;)
{AD0_RESULT_FILTER();//读压力传感器并滤波,码值存入全局变量ad0_result
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -