main.c文件代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "adc.h"
//ALIENTEK ̽Ë÷ÕßSTM32F407¿ª·¢°å ʵÑé18
//ADCÄ£Êýת»»ÊµÑé-¿âº¯Êý°æ±¾
//¼¼ÊõÖ§³Ö£ºwww.openedv.com
//ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com
//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
//×÷ÕߣºÕýµãÔ×Ó @ALIENTEK
int main(void)
{
u16 adcx;
float temp;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2
delay_init(168); //³õʼ»¯ÑÓʱº¯Êý
uart_init(115200); //³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200
LED_Init(); //³õʼ»¯LED
LCD_Init(); //³õʼ»¯LCD½Ó¿Ú
Adc_Init(); //³õʼ»¯ADC
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"ADC TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/5/6");
POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É«
LCD_ShowString(30,130,200,16,16,"ADC1_CH5_VAL:");
LCD_ShowString(30,150,200,16,16,"ADC1_CH5_VOL:0.000V"); //ÏÈÔڹ̶¨Î»ÖÃÏÔʾСÊýµã
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_5,20);//»ñȡͨµÀ5µÄת»»Öµ£¬20´Îȡƽ¾ù
LCD_ShowxNum(134,130,adcx,4,16,0); //ÏÔʾADCC²ÉÑùºóµÄÔʼֵ
temp=(float)adcx*(3.3/4096); //»ñÈ¡¼ÆËãºóµÄ´øÐ¡ÊýµÄʵ¼Êµçѹֵ£¬±ÈÈç3.1111
adcx=temp; //¸³ÖµÕûÊý²¿·Ö¸øadcx±äÁ¿£¬ÒòΪadcxΪu16ÕûÐÎ
LCD_ShowxNum(134,150,adcx,1,16,0); //ÏÔʾµçѹֵµÄÕûÊý²¿·Ö£¬3.1111µÄ»°£¬ÕâÀï¾ÍÊÇÏÔʾ3
temp-=adcx; //°ÑÒѾÏÔʾµÄÕûÊý²¿·ÖÈ¥µô£¬ÁôÏÂСÊý²¿·Ö£¬±ÈÈç3.1111-3=0.1111
temp*=1000; //СÊý²¿·Ö³ËÒÔ1000£¬ÀýÈ磺0.1111¾Íת»»Îª111.1£¬Ï൱ÓÚ±£ÁôÈýλСÊý¡£
LCD_ShowxNum(150,150,temp,3,16,0X80); //ÏÔʾСÊý²¿·Ö£¨Ç°Ãæ×ª»»ÎªÁËÕûÐÎÏÔʾ£©£¬ÕâÀïÏÔʾµÄ¾ÍÊÇ111.
LED0=!LED0;
delay_ms(250);
}
}
adc.c文件代码:
#include "adc.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK STM32F407¿ª·¢°å
//ADC Çý¶¯´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//´´½¨ÈÕÆÚ:2014/5/6
//°æ±¾£ºV1.0
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//³õʼ»¯ADC
void Adc_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹÄÜGPIOAʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ʹÄÜADC1ʱÖÓ
//Ïȳõʼ»¯ADC1ͨµÀ5 IO¿Ú
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 ͨµÀ5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£ÄâÊäÈë
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//²»´øÉÏÏÂÀ
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1¸´Î»
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //¸´Î»½áÊø
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//¶ÀÁ¢Ä£Ê½
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//Á½¸ö²ÉÑù½×¶ÎÖ®¼äµÄÑÓ³Ù5¸öʱÖÓ
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMAʧÄÜ
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ô¤·ÖƵ4·ÖƵ¡£ADCCLK=PCLK2/4=84/4=21Mhz,ADCʱÖÓ×îºÃ²»Òª³¬¹ý36Mhz
ADC_CommonInit(&ADC_CommonInitStructure);//³õʼ»¯
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λģʽ
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//·ÇɨÃèģʽ
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//¹Ø±ÕÁ¬Ðø×ª»»
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//½ûÖ¹´¥·¢¼ì²â£¬Ê¹ÓÃÈí¼þ´¥·¢
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ÓÒ¶ÔÆë
ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸öת»»ÔÚ¹æÔòÐòÁÐÖÐ Ò²¾ÍÊÇֻת»»¹æÔòÐòÁÐ1
ADC_Init(ADC1, &ADC_InitStructure);//ADC³õʼ»¯
ADC_Cmd(ADC1, ENABLE);//¿ªÆôADת»»Æ÷
}
//»ñµÃADCÖµ
//ch: @ref ADC_channels
//ͨµÀÖµ 0~16ȡֵ·¶Î§Îª£ºADC_Channel_0~ADC_Channel_16
//·µ»ØÖµ:ת»»½á¹û
u16 Get_Adc(u8 ch)
{
//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles ); //ADC1,ADCͨµÀ,480¸öÖÜÆÚ,Ìá¸ß²ÉÑùʱ¼ä¿ÉÒÔÌá¸ß¾«È·¶È
ADC_SoftwareStartConv(ADC1); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø
return ADC_GetConversionValue(ADC1); //·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û
}
//»ñȡͨµÀchµÄת»»Öµ£¬È¡times´Î,È»ºóƽ¾ù
//ch:ͨµÀ±àºÅ
//times:»ñÈ¡´ÎÊý
//·µ»ØÖµ:ͨµÀchµÄtimes´Îת»»½á¹ûƽ¾ùÖµ
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
以上是老师提供的有关ADC实验的示例keil代码,我想请你在这些代码的基础上进行修改完善来完成任务1、2、3,请分别给出两个文件中应该编译的代码