delay.c
#include "delay.h"
#include "sys.h"
static u8 fac_us=0;//usÑÓʱ±¶³ËÊý
static u16 fac_ms=0;//msÑÓʱ±¶³ËÊý
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //Ñ¡ÔñÍⲿʱÖÓ HCLK/8
fac_us=SystemCoreClock/8000000; //ΪϵͳʱÖÓµÄ1/8
fac_ms=(u16)fac_us*1000;//·ÇucosÏÂ,´ú±íÿ¸ömsÐèÒªµÄsystickʱÖÓÊý
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //ʱ¼ä¼ÓÔØ
SysTick->VAL=0x00; //Çå¿Õ¼ÆÊýÆ÷
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //¿ªÊ¼µ¹Êý
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//µÈ´ýʱ¼äµ½´ï
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //¹Ø±Õ¼ÆÊýÆ÷
SysTick->VAL =0X00; //Çå¿Õ¼ÆÊýÆ÷
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//ʱ¼ä¼ÓÔØ(SysTick->LOADΪ24bit)
SysTick->VAL =0x00; //Çå¿Õ¼ÆÊýÆ÷
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //¿ªÊ¼µ¹Êý
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//µÈ´ýʱ¼äµ½´ï
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //¹Ø±Õ¼ÆÊýÆ÷
SysTick->VAL =0X00; //Çå¿Õ¼ÆÊýÆ÷
}
delay.h
#ifndef __DELAY_H
#define __DELAY_H
#include "sys.h"
void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);
#endif
adc.c
#include "adc.h"
#include "delay.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//³õʼ»¯ADC
//ÕâÀïÎÒÃǽöÒÔ¹æÔòͨµÀΪÀý
//ÎÒÃÇĬÈϽ«¿ªÆôͨµÀ0~3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //ʹÄÜADC1ͨµÀʱÖÓ
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ÉèÖÃADC·ÖƵÒò×Ó6 72M/6=12,ADC×î´óʱ¼ä²»Äܳ¬¹ý14M
//PA1 ×÷ΪģÄâͨµÀÊäÈëÒý½Å
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Ä£ÄâÊäÈëÒý½Å
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4; //´¬ÓÿØÖÆÆ÷¶æ½Ç
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Ä£ÄâÊäÈëÒý½Å
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7; //´¬ÓÿØÖÆÆ÷ÍÆ½ø
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Ä£ÄâÊäÈëÒý½Å
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //¸´Î»ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC¹¤×÷ģʽ:ADC1ºÍADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½
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Êý¾ÝÓÒ¶ÔÆë
ADC_InitStructure.ADC_NbrOfChannel = 1; //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿
ADC_Init(ADC1, &ADC_InitStructure); //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷
ADC_TempSensorVrefintCmd(ENABLE); //¿ªÆôÄÚ²¿Î¶ȴ«¸ÐÆ÷
ADC_Cmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1
ADC_ResetCalibration(ADC1); //ʹÄܸ´Î»Ð£×¼
while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×¼½áÊø
ADC_StartCalibration(ADC1); //¿ªÆôADУ׼
while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýУ׼½áÊø
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ
}
//»ñµÃADCÖµ
//ch:ͨµÀÖµ 0~3
u16 Get_Adc(u8 ch)
{
//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADCͨµÀ,²ÉÑùʱ¼äΪ239.5ÖÜÆÚ
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø
return ADC_GetConversionValue(ADC1); //·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û
}
u8 adc1_flag=0;
u16 adc1_temp_value=0;
u16 Get_Adc_Average1(u8 ch,u8 times)
{
u16 adc_array[100]={0};
int i=0;
u8 ii,jj;
u32 temp_val=0;////Öмä±äÁ¿
u32 adc_average=0;
u8 t;
for(i=0;i<100;i++)
{
adc_array[i]=Get_Adc(ch);
delay_us(500);
}
for(ii=0;ii<99;ii++)
{
for(jj=0;jj<99-ii;jj++)
{
if(adc_array[jj]>adc_array[jj+1])
{
temp_val=adc_array[jj+1];
adc_array[jj+1]=adc_array[jj];
adc_array[jj]=temp_val;
}
}
}
//for(i=0;i<100;i++)
// printf("adc_array[%d]=%d\r\n",i,adc_array[i]);
for(t=40;t<50;t++)
{
adc_average+=adc_array[t];
}
//adc_temp_value=adc_array[50];
memset(adc_array,0,100);//////¶ÔÊý×éÇå0,½«adc_arrayµÄǰ100
adc_average=adc_average/10;
if(adc1_flag==0)////¼Ç¼һ´Îµ±Ç°Öµ
{
adc1_flag=1;
adc1_temp_value=adc_average;
}
// printf("adc_average=%d\r\n",adc_average);
// printf("adc_temp_value=%d\r\n",adc_temp_value);
if(abs(adc1_temp_value-adc_average)<=8)////Èç¹ûÕâ´ÎºÍÉϴβɼ¯µÄ²îֵСÓÚ=6£¬¾Í±íʾ½ÇÎ»ÒÆÃ»ÓÐת¶¯£¬±£³ÖÉϴεÄÖµ
{
adc_average=adc1_temp_value;
}
else
{
adc1_flag=0;
}
// printf("adc_average=%d\r\n",adc_average);
// printf("adc_temp_value=%d\r\n",adc_temp_value);
// printf("abs=%d\r\n",abs(adc1_temp_value-adc_average));
// if(abs(adc_temp_value-adc_average)>=1&&adc_flag==1)
// {
// printf("888\r\n");
//
// adc_average=adc_temp_value;
// }
// else
// {
// adc_flag=0;
// }
//printf("adc_average=%d\r\n",adc_average);
return adc_average;
}
u8 adc4_flag=0;
u16 adc4_temp_value=0;
u16 Get_Adc_Average4(u8 ch,u8 times)
{
u16 adc_array[100]={0};
int i=0;
u8 ii,jj;
u32 temp_val=0;////Öмä±äÁ¿
u32 adc_average=0;
u8 t;
for(i=0;i<100;i++)
{
adc_array[i]=Get_Adc(ch);
delay_us(500);
}
for(ii=0;ii<99;ii++)
{
for(jj=0;jj<99-ii;jj++)
{
if(adc_array[jj]>adc_array[jj+1])
{
temp_val=adc_array[jj+1];
adc_array[jj+1]=adc_array[jj];
adc_array[jj]=temp_val;
}
}
}
//for(i=0;i<100;i++)
// printf("adc_array[%d]=%d\r\n",i,adc_array[i]);
for(t=40;t<50;t++)
{
adc_average+=adc_array[t];
}
//adc_temp_value=adc_array[50];
memset(adc_array,0,100);//////¶ÔÊý×éÇå0
adc_average=adc_average/10;
if(adc4_flag==0)////¼Ç¼һ´Îµ±Ç°Öµ
{
adc4_flag=1;
adc4_temp_value=adc_average;
}
// printf("adc_average=%d\r\n",adc_average);
// printf("adc_temp_value=%d\r\n",adc_temp_value);
if(abs(adc4_temp_value-adc_average)<=8)////Èç¹ûÕâ´ÎºÍÉϴβɼ¯µÄ²îֵСÓÚ=6£¬¾Í±íʾ½ÇÎ»ÒÆÃ»ÓÐת¶¯£¬±£³ÖÉϴεÄÖµ
{
adc_average=adc4_temp_value;
}
else
{
adc4_flag=0;
}
// printf("adc_average=%d\r\n",adc_average);
// printf("adc_temp_value=%d\r\n",adc_temp_value);
//printf("abs=%d\r\n",abs(adc4_temp_value-adc_average));
// if(abs(adc_temp_value-adc_average)>=1&&adc_flag==1)
// {
// printf("888\r\n");
//
// adc_average=adc_temp_value;
// }
// else
// {
// adc_flag=0;
// }
//printf("adc_average=%d\r\n",adc_average);
return adc_average;
}
u8 adc7_flag=0;
u16 adc7_temp_value=0;
u16 Get_Adc_Average7(u8 ch,u8 times)
{
u16 adc_array[100]={0};
int i=0;
u8 ii,jj;
u32 temp_val=0;////Öмä±äÁ¿
u32 adc_average=0;
u8 t;
for(i=0;i<100;i++)
{
adc_array[i]=Get_Adc(ch);
delay_us(500);
}
for(ii=0;ii<99;ii++)
{
for(jj=0;jj<99-ii;jj++)
{
if(adc_array[jj]>adc_array[jj+1])
{
temp_val=adc_array[jj+1];
adc_array[jj+1]=adc_array[jj];
adc_array[jj]=temp_val;
}
}
}
//for(i=0;i<100;i++)
// printf("adc_array[%d]=%d\r\n",i,adc_array[i]);
for(t=40;t<50;t++)
{
adc_average+=adc_array[t];
}
//adc_temp_value=adc_array[50];
memset(adc_array,0,100);//////¶ÔÊý×éÇå0
adc_average=adc_average/10;
if(adc7_flag==0)////¼Ç¼һ´Îµ±Ç°Öµ
{
adc7_flag=1;
adc7_temp_value=adc_average;
}
// printf("adc_average=%d\r\n",adc_average);
// printf("adc_temp_value=%d\r\n",adc_temp_value);
if(abs(adc7_temp_value-adc_average)<=8)////Èç¹ûÕâ´ÎºÍÉϴβɼ¯µÄ²îֵСÓÚ=6£¬¾Í±íʾ½ÇÎ»ÒÆÃ»ÓÐת¶¯£¬±£³ÖÉϴεÄÖµ
{
adc_average=adc7_temp_value;
}
else
{
adc7_flag=0;
}
// printf("adc_average=%d\r\n",adc_average);
// printf("adc_temp_value=%d\r\n",adc_temp_value);
//printf("abs=%d\r\n",abs(adc4_temp_value-adc_average));
// if(abs(adc_temp_value-adc_average)>=1&&adc_flag==1)
// {
// printf("888\r\n");
//
// adc_average=adc_temp_value;
// }
// else
// {
// adc_flag=0;
// }
//printf("adc_average=%d\r\n",adc_average);
return adc_average;
}
adc.h
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEKÕ½½¢STM32¿ª·¢°å
//ADC ´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2012/9/7
//°æ±¾£ºV1.0
//°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
void Adc_Init(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average1(u8 ch,u8 times);
u16 Get_Adc_Average4(u8 ch,u8 times);
u16 Get_Adc_Average7(u8 ch,u8 times);
#endif
STM32延时与ADC采样
本文介绍了一个基于STM32的延时函数实现方法,并详细展示了ADC初始化配置及采样平均值获取的过程。通过对ADC通道进行精确配置,实现了稳定的模拟信号采集。
524

被折叠的 条评论
为什么被折叠?



