新手入门
- 积分
- 18
- 金钱
- 18
- 注册时间
- 2016-3-30
- 在线时间
- 1 小时
|
5金钱
最近在做多通道ADC-DMA-LCD实验,成功在lcd上显示数字,也能通过printf在上位机接收数据,但转换后的电压值明显不对,已经排除硬件问题,因为使用其它AD转换程序可以正确显示。
以下是比较重要的几个.c:
main.c
#include "public.h"
#include "systick.h"
#include "printf.h"
#include "dma.h"
#include "lcd_driver.h"
#include "gui.h"
#include "adc.h"
u16 adc_data[50][6];
u16 average[6];
float voltvalue[6];
int main()
{
Dma_Init();
Printf_Init();
TFT_Init();
TFT_ClearScreen(BLACK); //清屏
GUI_Show12HANZI(10,10,WHITE,BLACK);
GUI_Show12ASCII(46,10,"1",YELLOW,BLACK);
GUI_Show12HANZI(10,40,WHITE,BLACK);
GUI_Show12ASCII(46,40,"2",YELLOW,BLACK);
GUI_Show12HANZI(10,70,WHITE,BLACK);
GUI_Show12ASCII(46,70,"3",YELLOW,BLACK);
GUI_Show12HANZI(10,100,WHITE,BLACK);
GUI_Show12ASCII(46,100,"4",YELLOW,BLACK);
GUI_Show12HANZI(10,130,WHITE,BLACK);
GUI_Show12ASCII(46,130,"5",YELLOW,BLACK);
GUI_Show12HANZI(30,200,GREEN,BLACK);
GUI_Show12ASCII(62,200,"AD",YELLOW,BLACK);
while(1)
{
Average();
Adc_Display();
printf("通道AD电压值:%f V\r\n",voltvalue[0]);
delay_ms(10);
printf("通道AD平均值:%d V\r\n",average[0]);
delay_ms(10);
printf("通道1电压值:%f V\r\n",voltvalue[1]);
delay_ms(10);
printf("通道2电压值:%f V\r\n",voltvalue[2]);
delay_ms(10);
printf("通道3电压值:%f V\r\n",voltvalue[3]);
delay_ms(10);
printf("通道4电压值:%f V\r\n",voltvalue[4]);
delay_ms(10);
printf("通道5电压值:%f V\r\n",voltvalue[5]);
delay_ms(500);
}
}
dma.c
#include "dma.h"
void Dma_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel =6;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 3, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 4, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 5, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 6, ADC_SampleTime_239Cycles5);
ADC_DMACmd(ADC1,ENABLE);
ADC_Cmd(ADC1,ENABLE) ;
ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)adc_data;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 300 ;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1,ENABLE);
}
adc.c
#include "adc.h"
void Adc_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel =1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE) ;
ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
void Average()
{
u16 sum=0;
u8 i,j;
for(i=0;i<6;i++)
{
for(j=0;j<50;j++)
{
sum+=adc_data[j];
}
average=sum/50;
sum=0;
}
}
void Adc_Display()
{
u16 num;
u8 i,dat[6];
for(i=0;i<6;i++)
{
voltvalue=(float)average*(3.3/4096);
}
delay_ms(1000);
num=(u16)(voltvalue[0]*100);
dat[0]=num/100+0x30;
dat[1]='.';
dat[2]=num%100/10+0x30;
dat[3]=num%100%10+0x30;
dat[4]='V';
dat[5]='\0';
GUI_Show12ASCII(142,200,dat,YELLOW,BLACK);
for(i=1;i<6;i++)
{
num=(u16)(voltvalue*100);
dat[0]=num/100+0x30;
dat[1]='.';
dat[2]=num%100/10+0x30;
dat[3]=num%100%10+0x30;
dat[4]='V';
dat[5]='\0';
GUI_Show12ASCII(122,10+((i-1)*30),dat,YELLOW,BLACK);
}
}
数字显示基本没什么规律,最大也就刚过1v,一般都到不了1v。
求大神帮忙!
|
|