金牌会员
 
- 积分
- 2878
- 金钱
- 2878
- 注册时间
- 2016-6-17
- 在线时间
- 321 小时
|
发表于 2016-7-24 14:30:29
|
显示全部楼层
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
#include "dma.h"
/////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ADC1的0通道--7通道测试
//作者;jia
//创建日期:2016年4月19日21:44:43
//部分程序引用@正点原子@开源网网友JJ
//对此程序如有疑问或建议,可发邮箱至 jiayubao12@163.com
//////////////////////////////////////////////////////////////////////////////////
#define N 50 //取50次平均值
#define M 8 //8路AD
u16 value[N][M];//存储ADC转换后N*M个数字量的数据
u16 aftervalue[M];//存储M个通道数字量的平均值
float avalue[M];//滤波后的通道采样电压值
u8 i=0,j=0;
////////////////滤波函数/////////////////////////////////////////////////////////////////////////
void filter(void)
{
int sum = 0;//sum 通道采样数值的总和
u8 count;//
for(i=0;i<M;i++)//每个通道进行循环滤波
{
for(count=0;count<N;count++)//采样N次循环
{
sum+=value[count];//计算出N次采样值的总和
}
aftervalue=sum/N;//求出通道数字量的平均值
sum=0;//清零便于下次重新计算
}
}
/////////////////////////////主程序////////////////////////////////////////////////////////////
/////////////////////////////主程序////////////////////////////////////////////////////////////
int main(void)
{
u8 x=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init();
Adc_Init(); //ADC初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,8,200,16,16,"Mini STM32");
LCD_ShowString(60,24,200,16,16,"ADC+DMA TEST");
//显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,40,200,16,16,"ADC_CH0_VAL:");
LCD_ShowString(60,56,200,16,16,"ADC_CH1_VAL:");
LCD_ShowString(60,72,200,16,16,"ADC_CH2_VAL:");
LCD_ShowString(60,88,200,16,16,"ADC_CH3_VAL:");
LCD_ShowString(60,104,200,16,16,"ADC_CH4_VAL:");
LCD_ShowString(60,120,200,16,16,"ADC_CH5_VAL:");
LCD_ShowString(60,136,200,16,16,"ADC_CH6_VAL:");
LCD_ShowString(60,152,200,16,16,"ADC_CH7_VAL:");
POINT_COLOR=BRRED;
LCD_ShowString(60,168,200,16,16,"ADC_CH0_VOL:0.000V");
LCD_ShowString(60,184,200,16,16,"ADC_CH1_VOL:0.000V");
LCD_ShowString(60,200,200,16,16,"ADC_CH2_VOL:0.000V");
LCD_ShowString(60,216,200,16,16,"ADC_CH3_VOL:0.000V");
LCD_ShowString(60,232,200,16,16,"ADC_CH4_VOL:0.000V");
LCD_ShowString(60,248,200,16,16,"ADC_CH5_VOL:0.000V");
LCD_ShowString(60,264,200,16,16,"ADC_CH6_VOL:0.000V");
LCD_ShowString(60,280,200,16,16,"ADC_CH7_VOL:0.000V");
MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)&value,M*N);//初始化DMA
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件打开ADC转换
DMA_Cmd(DMA1_Channel1, ENABLE); //打开DMA功能
while(1)
{
filter();//滤波,此处函数一定不能省,否则ADC不能正常工作
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowxNum(156,40,aftervalue[0],4,16,0);//显示ADC的值
LCD_ShowxNum(156,56,aftervalue[1],4,16,0);//显示ADC的值
LCD_ShowxNum(156,72,aftervalue[2],4,16,0);//显示ADC的值
LCD_ShowxNum(156,88,aftervalue[3],4,16,0);//显示ADC的值
LCD_ShowxNum(156,104,aftervalue[4],4,16,0);//显示ADC的值
LCD_ShowxNum(156,120,aftervalue[5],4,16,0);//显示ADC的值
LCD_ShowxNum(156,136,aftervalue[6],4,16,0);//显示ADC的值
LCD_ShowxNum(156,152,aftervalue[7],4,16,0);//显示ADC的值
///////////////计算出每个通道数字量对应的电压值的整数部分/////
for(i=0;i<M;i++)
{
avalue=(float)aftervalue*(3.3/4096);
aftervalue=avalue;
}
/////////////////显示整数部分/////////////////////
POINT_COLOR=BRRED;
LCD_ShowxNum(156,168, aftervalue[0],1,16,0);//显示电压值
LCD_ShowxNum(156,184, aftervalue[1],1,16,0);//显示电压值
LCD_ShowxNum(156,200, aftervalue[2],1,16,0);//显示电压值
LCD_ShowxNum(156,216, aftervalue[3],1,16,0);//显示电压值
LCD_ShowxNum(156,232, aftervalue[4],1,16,0);//显示电压值
LCD_ShowxNum(156,248, aftervalue[5],1,16,0);//显示电压值
LCD_ShowxNum(156,264, aftervalue[6],1,16,0);//显示电压值
LCD_ShowxNum(156,280, aftervalue[7],1,16,0);//显示电压值
//////////////计算出每个通道数字量对应的电压值的小数部分///////
for(i=0;i<M;i++)
{
avalue-=aftervalue;
avalue*=1000;//放大1000倍进行显示
}
/////////////////显示小数部分////////////////////
LCD_ShowxNum(172,168,avalue[0],3,16,0X80);
LCD_ShowxNum(172,184,avalue[1],3,16,0X80);
LCD_ShowxNum(172,200,avalue[2],3,16,0X80);
LCD_ShowxNum(172,216,avalue[3],3,16,0X80);
LCD_ShowxNum(172,232,avalue[4],3,16,0X80);
LCD_ShowxNum(172,248,avalue[5],3,16,0X80);
LCD_ShowxNum(172,264,avalue[6],3,16,0X80);
LCD_ShowxNum(172,280,avalue[7],3,16,0X80);
x++;
if(x==12)x=0;
LED0=!LED0;
delay_ms(200);
}
}
|
|