#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "exti.h"
#include "AD9954.h"
#include "adf4002.h"
#include "stdio.h"
#include "bsp_adc.h"
//#include "arm_math.h"
//extern u16 freq;
// ADC转换的电压值通过MDA方式传到SRAM
extern __IO uint16_t ADC_ConvertedValue[RHEOSTAT_NOFCHANEL];
//// 局部变量,用于保存转换计算后的电压值
//float ADC_ConvertedValueLocal[RHEOSTAT_NOFCHANEL]={0};
#define TableSize 100 //采集点数
float a[TableSize];
uint16_t b[TableSize];
/*========================================================滑动滤波==========================================================*/
//#define NUM 10 // 缓存区大小
//float filter(float data)//滑动滤波
//{
// static float buf[NUM];
// static uint16_t index=0,flag=0;
// static float sum=0;
//
// // 替换之前位置上的数据
// sum += data - buf[index];
// buf[index] = data;
// index++;
//
// // 控制数据循环放置到缓冲区
// if(index==NUM)
// {
// index = 0;
// flag = 1;
// }
//
// // 如果没有充满缓存区,有几个就取几个的平均
// if(flag==0) return sum/index;
// else return sum/NUM;
//}
/*========================================================ADC交流采集========================================================*/
float ADC_Average() //采集电压平均值
{
u32 i, j;
float temp;
for (i=0; i<TableSize; i++)
{
a[i] = ADC_ConvertedValue[0]/(float)4096*(float)3.3;
//printf("add 4,0,%d\xff\xff\xff", b[i]);//往ID号为7的 曲线控件的0通道 添加数据x
delay_us(10);
//printf("a[%d] = %f\r\n", i, a[i]);
}
i = 0;
for (j=0; j<TableSize; j++)
{
temp = temp + a[j];
}
//printf("temp = %f\r\n", temp/TableSize);
j = 0;
return temp/TableSize;
}
float Stable(void) //等待电压稳定
{
u32 k = 0;
float Aver[TableSize], flat = 0;
for (k=0; k<TableSize; k++)
{
Aver[k] = ADC_Average();
delay_ms(2000);
printf("Aver[%d]=%f\r\n", k, Aver[k]);
if (k>0 && (Aver[k]-Aver[k-1]) < 0.005) //稳定
{
flat = Aver[k];
printf("flat=%f\r\n\r\n",flat);
break;
}
}
k = 0;
return flat;
}
//float depth = 0; //调幅深度
float Fix(void) //电压修正函数
{
float temp = 0;
temp = Stable();
if (temp < 1.4)
{
temp = temp;
}
else if (temp >= 1.4 && temp <= 1.6)
{
temp = temp * (float)1.0516; //修正系数
}
else if (temp > 1.6 && temp <= 1.8)
{
temp = temp * (float)1.0829;
}
else if (temp > 1.8 && temp <= 2.0)
{
temp = temp * (float)1.1230;
}
else if (temp > 2.0 && temp <= 2.2)
{
temp = temp * (float)1.17654;
}
else if (temp > 2.2 && temp <= 2.4)
{
temp = temp * (float)1.24304;
}
else if (temp > 2.4 && temp <= 2.6)
{
temp = temp * (float)1.31812;
}
return temp;
}
/*========================================================主函数==============================================================*/
int main(void)
{
u32 i=0;
float average = 0, value = 0, depth = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200);//初始化串口波特率为115200
InitADF4002();//分频器
TIM4_Int_Init(10000-1,8400-1);//1s定时
EXTIX_Init();//*外部中断测频率 PA1
EXTIX2_Init();//*外部中断测频率 PA3
AD9954_Init();
AD9954_SETFRE(3000);
ADC_init();//PB0 PB1
EXTI->IMR &= ~(EXTI_Line1); //关闭了PA1
EXTI->IMR &= ~(EXTI_Line3); //关闭了PA3
while(1)
{
RDivideTest(10000);//max16383 输入1
//NDivideTest(1024);//max8191 输入2
//EXTI->IMR |= EXTI_Line1; //开启PA1
EXTI->IMR |= EXTI_Line3; //开启PA3
//value = ADC_ConvertedValue[0]/(float)4096*(float)3.3;//*sqrtf(2)
if (i == 0)
{
i = 1;
value = Fix(); //稳定电压
depth = value/3.17667*100;
printf("value=%f, depth=%f%%\r\n\r\n", value, depth);
}
//delay_ms(1000);
}
}
/*程序测试:
EXTI->IMR &= ~(EXTI_Line1); //关闭了指定的外部中断
EXTI->IMR |= EXTI_Line1; //开启指定的外部中断
//effect = max/sqrtf(2); //有效值
float MAX(void) //读取采集电压中最大的电压
{
float max1=0;
u32 i=0;
for(i=0;i<TableSize;i++)
{
if(a[i]>max1)
max1=a[i];
}
return max1;
}
float Average(void) //采集电压平均值
{
float temp=0;
u32 i=0;
for(i=0;i<TableSize;i++)
{
temp = temp + a[i];
}
return temp/TableSize;
}
// for (j=0; j<250; j++)
// {
// b[j] = filter(a[j]);//滑动滤波
// }
// j = 0;
*/
电子设计大赛——ADF4002分频器stm32F1/F4程序
5星 · 超过95%的资源 需积分: 5 111 浏览量
2022-07-28
19:40:45
上传
评论 2
收藏 4KB RAR 举报
行不地上
- 粉丝: 8868
- 资源: 2
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论5