新手上路
积分 20
金钱 20
注册时间 2017-11-13
在线时间 1 小时
1 金钱
程序是论坛里现成的程序修改的,用的是F103min板,结了一个引脚PC0也就是value(6),value(6)的电压变化显示是二点几伏到三点几伏,应该是对的,但是其他引脚悬空接了以后数值如图,很稳定不会变化,求大神指点为什么?还有一个问题,这个程序是12路AD采样的,如果想改成16路采样的话,除了引脚多写几个,数组变一下,DMA通道变一下以外,还有什么要注意的吗?时钟周期啥的还要改吗?采样时钟周期这部分不太懂
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_dma.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include <stdarg.h>
#define N 50 //ÿí¨μà2é50′Î
#define M 12 //Îa12¸öí¨μà
vu16 AD_Value[N][M]; //óÃà′′æ·ÅADC×a»»½á1û£¬ò2êÇDMAμÄÄ¿±êμØÖ·
vu16 After_filter[M]; //óÃà′′æ·ÅÇ󯽾ùÖμÖ®oóμĽá1û
int i;
unsigned char Clock1s;
vu32 TimingDelay=0;
void Usart2_Init(void);
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);
void Delay(__IO uint32_t nTime);
void TimingDelay_Decrement(void);
void GPIO_Configuration(void);
void RCC_Configuration(void);
void ADC1_Configuration(void);
void DMA_Configuration(void);
void Init_All_Periph(void);
u16 GetVolt(u16 advalue);
void filter(void);
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //òòÎaUSART11ü½ÅêÇòÔ¸′óÃμÄDÎê½½óμ½GPIO¿úéÏμÄ£¬ËùòÔê1óø′óÃíÆíìê½êä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA0/1/2/3 ×÷ÎaÄ£Äaí¨μàêäèëòy½Å
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Ä£Äaêäèëòy½Å
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PB0/1 ×÷ÎaÄ£Äaí¨μàêäèëòy½Å
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Ä£Äaêäèëòy½Å
GPIO_Init(GPIOB, &GPIO_InitStructure);
//PC0/1/2/3/4/5 ×÷ÎaÄ£Äaí¨μàêäèëòy½Å
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Ä£Äaêäèëòy½Å
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit(); //RCC Ïμí3¸′λ
RCC_HSEConfig(RCC_HSE_ON); //¿aÆôHSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //μè′yHSE×¼±¸oÃ
if(HSEStartUpStatus == SUCCESS)
{
// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
// FLASH_SetLatency(FLASH_Latency_2); //Set 2 Latency cycles
RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 clock = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 clock = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); //PLLCLK = 12MHz * 6 = 72 MHz
RCC_PLLCmd(ENABLE); //Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source
while(RCC_GetSYSCLKSource() != 0x08); //Wait till PLL is used as system clock source
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
| RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1, ENABLE ); //ê1ÄüADC1í¨μàê±Ö󣬸÷¸ö1ü½Åê±Öó
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC×î′óê±¼ä2»Äü3¬1y14M
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //ê1ÄüDMA′«êä
}
}
void ADC1_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit(ADC1); //½«íaéè ADC1 μÄè«2¿¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1¤×÷Ä£ê½:ADC1oíADC21¤×÷Ôú¶àá¢Ä£ê½
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //Ä£êy×a»»1¤×÷Ôúé¨ÃèÄ£ê½
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //Ä£êy×a»»1¤×÷Ôúá¬Dø×a»»Ä£ê½
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ía2¿′¥·¢×a»»1رÕ
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADCêy¾Yóò¶ÔÆë
ADC_InitStructure.ADC_NbrOfChannel = M; //Ë3Dò½øDD1æÔò×a»»μÄADCí¨μàμÄêyÄ¿
ADC_Init(ADC1, &ADC_InitStructure); //¸ù¾YADC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèADCxμļÄ′æÆ÷
//éèÖÃÖ¸¶¨ADCμÄ1æÔò×éí¨μ࣬éèÖÃËüÃÇμÄ×a»ˉË3Dòoí2éÑùê±¼ä
//ADC1,ADCí¨μàx,1æÔò2éÑùË3DòÖμÎay,2éÑùê±¼äÎa239.5ÖüÆú
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 5, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 6, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 7, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 8, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 9, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 10, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 11, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 12, ADC_SampleTime_239Cycles5 );
// ¿aÆôADCμÄDMAÖ§3Ö£¨òaêμÏÖDMA1|Äü£¬»1Dè¶àá¢ÅäÖÃDMAí¨μàμè2Îêy£©
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE); //ê1ÄüÖ¸¶¨μÄADC1
ADC_ResetCalibration(ADC1); //¸′λָ¶¨μÄADC1μÄD£×¼¼Ä′æÆ÷
while(ADC_GetResetCalibrationStatus(ADC1)); //»ñè¡ADC1¸′λD£×¼¼Ä′æÆ÷μÄ×′ì¬,éèÖÃ×′ì¬Ôòμè′y
ADC_StartCalibration(ADC1); //¿aê¼Ö¸¶¨ADC1μÄD£×¼×′ì¬
while(ADC_GetCalibrationStatus(ADC1)); //»ñè¡Ö¸¶¨ADC1μÄD£×¼3ìDò,éèÖÃ×′ì¬Ôòμè′y
}
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1); //½«DMAμÄí¨μà1¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMAíaéèADC»ùμØÖ·
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; //DMAÄú′æ»ùμØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //Äú′æ×÷Îaêy¾Y′«êäμÄÄ¿μÄμØ
DMA_InitStructure.DMA_BufferSize = N*M; //DMAí¨μàμÄDMA»o′æμÄ′óD¡
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //íaéèμØÖ·¼Ä′æÆ÷2»±ä
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //Äú′æμØÖ·¼Ä′æÆ÷μYÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //êy¾Y¿í¶èÎa16λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //êy¾Y¿í¶èÎa16λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //1¤×÷ÔúÑ-»·»o′æÄ£ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMAí¨μà xóμóD¸ßóÅÏè¼¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMAí¨μàxûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //¸ù¾YDMA_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉDMAμÄí¨μà
}
u16 GetVolt(u16 advalue)
{
return (u16)(advalue * 330 / 4096); //ÇóμĽá1ûà©′óáË100±¶£¬·½±ãÏÂÃæÇó3öD¡êy
}
void filter(void)
{
int sum = 0;
u8 count;
for(i=0;i<12;i++)
{
for ( count=0;count<N;count++)
{
sum += AD_Value[count];
}
After_filter=sum/N;
sum=0;
}
}
/****************************************************************************
* Ãû 3Æ£ovoid Usart2_Init(void)
* 1| Äü£o′®¿ú13õê¼»ˉoˉêy
* èë¿ú2Îêy£oÎT
* 3ö¿ú2Îêy£oÎT
* Ëμ Ã÷£o
* μ÷ó÷½·¨£oÎT
****************************************************************************/
void Usart2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 , ENABLE); //ê1Äü′®¿ú2ê±Öó
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2 TX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_Init(GPIOA, &GPIO_InitStructure); //A¶Ë¿ú
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //¸′óÿa©êäèë
GPIO_Init(GPIOA, &GPIO_InitStructure); //A¶Ë¿ú
USART_InitStructure.USART_BaudRate = 115200; //ËùÂê115200bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //êy¾Yλ8λ
USART_InitStructure.USART_StopBits = USART_StopBits_1; //í£Ö1λ1λ
USART_InitStructure.USART_Parity = USART_Parity_No; //ÎTD£Ñéλ
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //ÎTó2¼tá÷¿Ø
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //êÕ·¢Ä£ê½
/* Configure USART1 */
USART_Init(USART2, &USART_InitStructure); //ÅäÖÃ′®¿ú2Îêyoˉêy
/* Enable the USART1 */
USART_Cmd(USART2, ENABLE);
}
void uart_init(u32 bound){
//GPIO¶Ë¿úéèÖÃ
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ê1ÄüUSART1£¬GPIOAê±Öó
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9
//USART1_RX GPIOA.103õê¼»ˉ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.10
//Usart1 NVIC ÅäÖÃ
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇàÕ¼óÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×óóÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μàê1Äü
NVIC_Init(&NVIC_InitStructure); //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
//USART 3õê¼»ˉéèÖÃ
USART_InitStructure.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //êÕ·¢Ä£ê½
USART_Init(USART1, &USART_InitStructure); //3õê¼»ˉ′®¿ú1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿aÆô′®¿ú½óêüÖD¶Ï
USART_Cmd(USART1, ENABLE); //ê1Äü′®¿ú1
}
//ÅäÖÃËùóDíaéè
void Init_All_Periph(void)
{
RCC_Configuration();
GPIO_Configuration();
ADC1_Configuration();
DMA_Configuration();
// Usart2_Init();
uart_init(9600); //′®¿ú3õê¼»ˉÎa9600
}
/******************************************************
ÕûDÎêy¾Y×a×Ö·û′®oˉêy
char *itoa(int value, char *string, int radix)
radix=10 ±êê¾êÇ10½øÖÆ ·ÇꮽøÖÆ£¬×a»»½á1ûÎa0;
ày£od=-379;
Ö′DD itoa(d, buf, 10); oó
buf="-379"
**********************************************************/
char *itoa(int value, char *string, int radix)
{
int i, d;
int flag = 0;
char *ptr = string;
/* This implementation only works for decimal numbers. */
if (radix != 10)
{
*ptr = 0;
return string;
}
if (!value)
{
*ptr++ = 0x30;
*ptr = 0;
return string;
}
/* if this is a negative value insert the minus sign. */
if (value < 0)
{
*ptr++ = '-';
/* Make the value positive. */
value *= -1;
}
for (i = 10000; i > 0; i /= 10)
{
d = value / i;
if (d || flag)
{
*ptr++ = (char)(d + 0x30);
value -= (d * i);
flag = 1;
}
}
/* Null terminate the string. */
*ptr = 0;
return string;
} /* NCL_Itoa */
/****************************************************************************
* Ãû 3Æ£ovoid USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)
* 1| Äü£o¸ñê½»ˉ′®¿úêä3öoˉêy
* èë¿ú2Îêy£oUSARTx: Ö¸¶¨′®¿ú
Data£o ·¢Ëíêy×é
...: 2»¶¨2Îêy
* 3ö¿ú2Îêy£oÎT
* Ëμ Ã÷£o¸ñê½»ˉ′®¿úêä3öoˉêy
"\r" »Ø3μ·û USART_OUT(USART1, "abcdefg\r")
"\n" »»DD·û USART_OUT(USART1, "abcdefg\r\n")
"%s" ×Ö·û′® USART_OUT(USART1, "×Ö·û′®êÇ£o%s","abcdefg")
"%d" ꮽøÖÆ USART_OUT(USART1, "a=%d",10)
* μ÷ó÷½·¨£oÎT
****************************************************************************/
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){
const char *s;
int d;
char buf[16];
va_list ap;
va_start(ap, Data);
while(*Data!=0){ //ÅD¶ÏêÇ·ñμ½′ï×Ö·û′®½áêø·û
if(*Data==0x5c){ //'\'
switch (*++Data){
case 'r': //»Ø3μ·û
USART_SendData(USARTx, 0x0d);
Data++;
break;
case 'n': //»»DD·û
USART_SendData(USARTx, 0x0a);
Data++;
break;
default:
Data++;
break;
}
}
else if(*Data=='%'){ //
switch (*++Data){
case 's': //×Ö·û′®
s = va_arg(ap, const char *);
for ( ; *s; s++) {
USART_SendData(USARTx,*s);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
Data++;
break;
case 'd': //ꮽøÖÆ
d = va_arg(ap, int);
itoa(d, buf, 10);
for (s = buf; *s; s++) {
USART_SendData(USARTx,*s);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
Data++;
break;
default:
Data++;
break;
}
}
else USART_SendData(USARTx, *Data++);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
}
/****************************************************************************
* Ãû 3Æ£oint main(void)
* 1| Äü£oÖ÷oˉêy
* èë¿ú2Îêy£oÎT
* 3ö¿ú2Îêy£oÎT
* Ëμ Ã÷£o
* μ÷ó÷½·¨£o
****************************************************************************/
int main(void)
{
u16 value[M];
Init_All_Periph();
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE); //Æô¶ˉDMAí¨μà
SysTick_Config(72000);//1ms
while(1)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//μè′y′«êäíê3é·ñÔòμúò»Î»êy¾YèYò×¶aê§
filter();
for(i=0;i<12;i++)
{
value= GetVolt(After_filter);
if(i==11)
{
USART_OUT(USART1,"value[%d]=%d.%dv \r\n",i,value/100,value%100) ;
}
else
{
USART_OUT(USART1,"value[%d]=%d.%dv ,",i,value/100,value%100) ;
}
Delay(100);
}
}
}
/******************* (C) COPYRIGHT 2013 ·ü¶·STM32 *****END OF FILE****/
我来回答