之前写了一篇关于波形识别的**(2019年5月24日),原**失效。现在重新发文并进行小幅修改
ATMEGA328P-AU,一种集成电路 (IC),核心处理器是AVR,闪存容量为32KB。本问题提出一种用Atmega 328 方波三角波波形识别的代码。代码主要通过AVR单片机内部中断实现。主要参考资料
http://www.xjishu.com/zhuanli/54/201711478206_2.html
注意开头加入头文件math,因为后面要用到取整。
static int min = 0x0F;
static int max = 0;
static int prev_data;
int low = 768;//5V 以内
int up = 1024;
static up_count;
int peak_count;
char disp;//用字符串格式显示
ISR(ADC_vect) {//设置ADC比较中断
int adc_data = ADCW;//ADCW是读取所有数据
if (adc_data > max) max = adc_data;//这里是每次更新最大最小值
if (adc_data < min) min = adc_data;
if (adc_data > up) peak_count =peak_count +1;//确定是否高于中轴
if (adc_data > low)up_count =upcount+1;
else if (prev_data > thresh_low && up_count > 65) {
//计算方波三角波的占空比
ratio = (float) peak_count/up_count;
up_count = 0;
peak_count = 0;
//按照比例计算电压幅值
amplitude = (5/(double)1024)*(max - min);
amplitude =round(amplitude*10);
frequency = (1/(up_count * 0.001))*7.8;//注意频率的计算方法
frequency = round(frequency);
thresh_low = round((max-min)/2 + min);
thresh_up = round((max-min)*0.67 + min);
max = 0;
min = 1023;
}
prev_data = adc_data;
}
ISR(TIMER0_COMPA_vect){//注意这里使用即使器比较模式
ADCSRA |= 1<<ADSC; //这里是用了计时器的比较模式,当计时器置4,进入ADC中断
}
注意,本程序只包含中断程序,在主程序中需要对ADC和timer0的寄存器进行定义。这里将寄存器定义为ADC 32分频,timer0 256分频。当timer0 置为4时,触发ADC中断。判断波形后,可以用ratio这种方法驱动LED灯,来指示波形。频率可以用LCD1602显示.这里可以参考
http://www.**/xianshi/20171018566270.html |