主要功能描述:可以設置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)
2021-7-5 02:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|