主要功能描述:可以设置4种采样频率,利用GPIO-PIN-5外部中断来选择(1、2、3、4循环),实验中抗干扰较弱,可以尝试加一个上拉电阻。能观察波形的频率范围大概在300至5KHZ,过低的频率需要自己再修改相关分频和时钟;输入电压需要保证大于0,如果小于零需要设计分压电路来抬高输入电压,为了匹配需要测量的波形需要调整显示函数的参数;另外OLED也只是完成波形的显示,没有坐标轴等,需要自己修改添加。
主函数部分代码如下:
#include "delay.h"
#include "sys.h"
#include "stdio.h"
#include "oled.h"
#include "interrupt.h"
#include "ad.h"
#include "stdlib.h"
u16 resurt;
ADC_NODE* Top;
ADC_NODE* Tail;
ADC_NODE* InitNode;
ADC_NODE ADC_data[128];
unsigned char c=1;
void ShowVoltage(float Voltage,u8 startX,u8 startY);
int main(void)
{
ADC_NODE* GetResult;
unsigned char a, b;
float Voltages;
delay_init();
OLED_Init(); /
OLED_Clear();
ExitOn(); //GPIOA_PIN_5
ADC_DATA_Init();
ADC_init(RCC_PCLK2_Div8);
while(1)
{
ADC_Control(0);
GetResult = Tail; // change every 26.5us
GetResult = GetResult->next->next;
for(a=1; a<129;a++){
OLED_ClearLine(a);
//Voltages = (float)resurt*3.3/4096;
//Voltages = 16+15*sin(0.1*a);
b = (char)(GetResult->data*70/4096);
OLED_DrawP(a,b-33);
GetResult = GetResult->next;
}
ADC_Control(1);
delay_ms(50);
}
}
void EXTI9_5_IRQHandler(void){
c++;
if(c==5) c=0;
switch (c){
case 1: ADC_init(RCC_PCLK2_Div2);break;
case 2: ADC_init(RCC_PCLK2_Div4);break;
case 3: ADC_init(RCC_PCLK2_Div6);break;
case 4: ADC_init(RCC_PCLK2_Div8);break;
};
EXTI_ClearITPendingBit(Z_Line);
}
其中有一些头文件和代码没有在主程序中使用到,是学习和测试时写的可以删掉,仅保留示波器源程序。
接线说明:
A6接SCK ,A7接SDA,OLED接3.3V(注意不是0.96寸的OLED!)
电压输入接A1,需要共地,外部中断为A5。
代码下载:
STM32f103c8t6简易示波器.7z
(194.01 KB, 下载次数: 170)
|