Sign in to follow this  
Кинг

Stm32F103 Ацп Измерение С 2Х Каналов

9 posts in this topic

Кинг    0

Пишу программу в Cocoox в нейй нашел пример для измерения с 6 каналов АЦП.

/**
*****************************************************************************
* @title main.c
* @author habed
* @date 22 Jan 2013
* @brief IN THE NAME OF GOD
*		 here in this example i used DMA for access d
*		 irectly to 6 ADC channel in regular mode
*		 "Hosein Abedini"<k.h65
*		 70@gmail.com>
*		 ask me ur questions about.
*******************************************************************************
*/
////// The above comment is automatically generated by CoIDE ///////////////////
#include<stm32f10x_adc.h>
#include<stm32f10x_rcc.h>
#include<stm32f10x_gpio.h>
#include<stm32f10x_rcc.h>
#include<stm32f10x_dma.h>
ErrorStatus HSEStartUpStatus;
void Sys(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
uint16_t ADCBuffer[] = {0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA};
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
 /* HCLK = SYSCLK */
 RCC_HCLKConfig(RCC_SYSCLK_Div1);
 /* PCLK2 = HCLK */
 RCC_PCLK2Config(RCC_HCLK_Div1);
 /* PCLK1 = HCLK/2 */
 RCC_PCLK1Config(RCC_HCLK_Div2);
 /* ADCCLK = PCLK2/4 */
 RCC_ADCCLKConfig(RCC_PCLK2_Div4);
 /* Flash 2 wait state */
 *(vu32 *)0x40022000 = 0x01;
 /* PLLCLK = 8MHz * 9 = 56 MHz */
 RCC_PLLConfig(0x00010000, RCC_PLLMul_9);
 /* Enable PLL */
 RCC_PLLCmd(ENABLE);
 /* Wait till PLL is ready */
 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
 /* Select PLL as system clock source */
 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
 /* Wait till PLL is used as system clock source */
 while (RCC_GetSYSCLKSource() != 0x08);
}
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA
		 | RCC_APB2Periph_GPIOB
		 , ENABLE);
RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE ) ;
DMA_InitStructure.DMA_BufferSize = 6;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCBuffer;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd ( DMA1_Channel1 , ENABLE ) ;
RCC_ADCCLKConfig ( RCC_PCLK2_Div6 ) ;
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1 ,
ENABLE ) ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 6, ADC_SampleTime_7Cycles5);
ADC_Cmd ( ADC1 , ENABLE ) ;
ADC_DMACmd ( ADC1 , ENABLE ) ;
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd ( ADC1 , ENABLE ) ;
}
int main(void)
{
Sys();
while(1)
{
 /*you can read 6 channels of ADC1 in ADC buffer*/
}
}

мне нужен канал PA.0, PA.1.

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_7Cycles5);//1 канал АЦП PA.0

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_7Cycles5);//2 канал АЦП PA.1

забираю из ADCBuffer[0] и ADCBuffer[1].

значения только есть в ADCBuffer[0] а в ADCBuffer[1] пусто

Share this post


Link to post
Share on other sites
mail_robot    1502

чето я не понял что в листинге и что в прищепке. Зарисуй свой код как есть. То что на листе работать не будет

Edited by mail_robot

Share this post


Link to post
Share on other sites
Кинг    0
#include<stm32f10x_adc.h>
#include<stm32f10x_rcc.h>
#include<stm32f10x_gpio.h>
#include<stm32f10x_rcc.h>
#include<stm32f10x_dma.h>
ErrorStatus HSEStartUpStatus;
uint16_t ADCBuffer[] = {0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA};
void Sys(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
	 /* HCLK = SYSCLK */
	 RCC_HCLKConfig(RCC_SYSCLK_Div1);
	 /* PCLK2 = HCLK */
	 RCC_PCLK2Config(RCC_HCLK_Div1);
	 /* PCLK1 = HCLK/2 */
	 RCC_PCLK1Config(RCC_HCLK_Div2);
	 /* ADCCLK = PCLK2/4 */
	 RCC_ADCCLKConfig(RCC_PCLK2_Div4);
	 /* Flash 2 wait state */
	 *(vu32 *)0x40022000 = 0x01;
	 /* PLLCLK = 8MHz * 9 = 56 MHz */
	 RCC_PLLConfig(0x00010000, RCC_PLLMul_9);
	 /* Enable PLL */
	 RCC_PLLCmd(ENABLE);
	 /* Wait till PLL is ready */
	 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
	 /* Select PLL as system clock source */
	 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
	 /* Wait till PLL is used as system clock source */
	 while (RCC_GetSYSCLKSource() != 0x08);
}
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA
					 | RCC_APB2Periph_GPIOB
					 , ENABLE);
RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE ) ;
DMA_InitStructure.DMA_BufferSize = 6;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCBuffer;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd ( DMA1_Channel1 , ENABLE ) ;
RCC_ADCCLKConfig ( RCC_PCLK2_Div6 ) ;
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1 ,
ENABLE ) ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_7Cycles5);
ADC_Cmd ( ADC1 , ENABLE ) ;
ADC_DMACmd ( ADC1 , ENABLE ) ;
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd ( ADC1 , ENABLE ) ;
}
int main(void)
{
uint16_t res1=0,res2=0;
Sys();
while(1)
{
	 res1=ADCBuffer[0] ;
	 res2= ADCBuffer[1];
}
}

Share this post


Link to post
Share on other sites

Старт складской программы по Wi-Fi/ Bluetooth-чипам от Espressif

На склад КОМПЭЛ поступили чипы, модули и отладочные платы от компании Espressif Systems на базе ESP8266 и ESP32. Стоимость всех изделий данной линейки – в 2-3 раза ниже ближайших аналогов, чипы занимают минимальное место на плате, энергоэффективны и универсальны в применении

Подробнее...

mail_robot    1502

uint32_t ADCBuffer[2];

DMA_InitStructure.DMA_BufferSize = 2;

uint32_t res1=0,res2=0;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

для начала

ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

не увидел этой строчки нигде. Надо вставить перед

DMA_Cmd ( DMA1_Channel1 , ENABLE ) ;

хотя код такой сумбурный, что хз где тут ее грамотнее ставить.

Edited by mail_robot

Share this post


Link to post
Share on other sites
mail_robot    1502

чет подумал, наверн всетки строчку

ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

надо поставить перед

ADC_DMACmd ( ADC1 , ENABLE ) ;

тогда цикличные запросы должны пойти и массивчик начнет заливаться регулярно, иначе придется дергать вручную

и вот это вот

ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1));

я бы поставил перед

ADC_Cmd ( ADC1 , ENABLE ) ;

потому как в мануале пишут, что калибровка должна быть выполнена до запуска АЦП

Edited by mail_robot

Share this post


Link to post
Share on other sites

Вебинар Литиевые ХИТы FANSO или что нужно знать инженеру о батарейках»

20 июня компания Компэл приглашает всех желающих принять участие в вебинаре, посвященном литиевым батарейкам FANSO. На вебинаре будет рассказано о параметрах батареек, их зависимости от режима работы и эксплуатации. Будет дана информация о том, на какие параметры следует обращать внимание, выбирая литиевый ХИТ, и как избежать некоторых проблем.

Подробнее...

Кинг    0

ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); этой строчки компилятор незнает

если калибровку ставить перед запуском АЦП то он зацикливается на while(ADC_GetResetCalibrationStatus(ADC1));

Share this post


Link to post
Share on other sites
mail_robot    1502

ну тогда надо внимательно посмотреть мануал на тему порядка калибровки под свой камень. Выходит не все они похожи.

про первую строчку - посмотрите функцию в библиотеке, они бывает на одну буковку отличаются. Тут надо некоторую фантазию включать

Edited by mail_robot

Share this post


Link to post
Share on other sites
Кинг    0
void ADCInit(void){
   //--Enable ADC1 and GPIOA--
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
   GPIO_InitTypeDef GPIO_InitStructure; //Variable used to setup the GPIO pins
   //==Configure ADC pins (PA0 -> Channel 0 to PA7 -> Channel 7) as analog inputs==
   GPIO_StructInit(&GPIO_InitStructure); // Reset init structure, if not it can cause issues...
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   ADC1->CR2 |= ADC_CR2_CAL; //Запуск калибровки АЦП
   while (!(ADC1->CR2 & ADC_CR2_CAL));
   ADC_InitTypeDef ADC_InitStructure;
   //ADC1 configuration
   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
   //We will convert multiple channels
   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
   //select continuous conversion mode
   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//!
   //select no external triggering
   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
   //right 12-bit data alignment in ADC data register
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   //8 channels conversion
   ADC_InitStructure.ADC_NbrOfChannel = 2;
   //load structure values to control and status registers
   ADC_Init(ADC1, &ADC_InitStructure);
   //wake up temperature sensor
   //ADC_TempSensorVrefintCmd(ENABLE);
   //configure each channel
   ADC_Cmd(ADC1, ENABLE);
}
void get_adc (void)
{
unsigned int adc_res=0,adc_res2=0,voltage=0,voltage1=0; //Использовал переменную для отладки. Можно и без неё
unsigned char index=0;
unsigned int adc[7],adc1[7];
for(index=0;index<6;index++)
{
ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1,ADC_SampleTime_28Cycles5);
   ADC_ClearFlag (ADC1,ADC_FLAG_EOC);
   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
   while (ADC_GetFlagStatus (ADC1,ADC_FLAG_EOC) == RESET);	    // wait for conversion to complete
   adc_res  = ADC_GetConversionValue (ADC1);
   ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1,ADC_SampleTime_28Cycles5);
 ADC_ClearFlag (ADC1,ADC_FLAG_EOC);
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);	    // start another
 while (ADC_GetFlagStatus (ADC1,ADC_FLAG_EOC) == RESET);
 adc_res2  = ADC_GetConversionValue (ADC1);
 adc[index]= adc_res;
 adc1[index]=adc_res2;
}
volt=adc[1]+adc[2]+adc[3]+adc[4]+adc[5];
voltage=volt;
volt=volt/5;
volt= (volt * 80) / 1000;
voltage=volt;
amper=adc1[1]+adc1[2]+adc1[3]+adc1[4]+adc1[5];
 voltage1=amper;
amper=amper/5;
amper=amper/0.02*10;
amper= (amper * 80) / 100000;
   voltage1=amper;
   wat=(volt*amper)/100;
}
этот заработал

Share this post


Link to post
Share on other sites
LoKeR    0

этот заработал

а у меня не заработало ввыводит

source\main.c(24): error:  #268: declaration may not appear after executable statement in block

как можно избавиться от этой проблемы?

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this