PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : ADC میکروی STM32f103 می تونه مقدار منفی بخونه؟



mohsen-p
06-10-2012, 22:41
ADC میکروی STM32f103 می تونه مقدار منفی بخونه؟(ورودی ADC چند تا چنده)

Doloop
07-10-2012, 01:59
من توی دیتا شیت اینو دیدم...دیگه نمیدونم منظور دقیقش چیه؟!!!
یعنی اگه ولتاژ رفرنس منفی باشه ولتاژ ورودی میتونه منفی باشه ولی بزرگتر از رفرنس باشه !!!؟




adc input range: Vref- ≤ vin ≤ vref+



اساتید هم نظراتشون رو اعمال کنند...

Greatal
01-08-2013, 01:54
دوست من تا اونجایی که من میدونم مستقیم که اصلا نمیشه به چند دلیل
1-اول اگر از آی سی با کمتر از 100 پایه استفاده میکنید که Vref- و vref+ ندارید که بتونید بهش بدید!
2- طبق رفنس وحشتناک ناراحت st این دو پایه vref+حد اقل +2.4 و vref- حد اقل 0 یا گراند رو میگیره یعنی منفی بی منفی!
اما می تونید برای سیگنالتون یه افست ایجاد کنید یا اون رو از آپ امپ رد کنید(سینگل سوپلای ) و یه ویرچوال گراند ایجاد کنید و گراند سیستم سگنالتون رو ویرچوال گراند آپ امپنتون قارار بدید میشه یه کاریش کرد البته اگر از فیلتر های پسیو برای فیلتر و تقویت مجدد استفاده می کنید داستان یکم دردسر میشه احتمالا چوم خازن فیلتر دیسی افست شما رو حذف می کنه و اون وست حال خرو بیارو ... .
امید وارم اشتباه نگفته باشم از اساتید گر اشتباهی کردم لطفا پیام خصوصی و عمومی بدن که بنده اصلاح کنم باعث سردرگمی خلق خدا نشم

sjafarim
01-08-2013, 03:01
دوست من تا اونجایی که من میدونم مستقیم که اصلا نمیشه به چند دلیل
1-اول اگر از آی سی با کمتر از 100 پایه استفاده میکنید که vref- و vref+ ندارید که بتونید بهش بدید!
2- طبق رفنس وحشتناک ناراحت st این دو پایه vref+حد اقل +2.4 و vref- حد اقل 0 یا گراند رو میگیره یعنی منفی بی منفی!
اما می تونید برای سیگنالتون یه افست ایجاد کنید یا اون رو از آپ امپ رد کنید(سینگل سوپلای ) و یه ویرچوال گراند ایجاد کنید و گراند سیستم سگنالتون رو ویرچوال گراند آپ امپنتون قارار بدید میشه یه کاریش کرد البته اگر از فیلتر های پسیو برای فیلتر و تقویت مجدد استفاده می کنید داستان یکم دردسر میشه احتمالا چوم خازن فیلتر دیسی افست شما رو حذف می کنه و اون وست حال خرو بیارو ... .
امید وارم اشتباه نگفته باشم از اساتید گر اشتباهی کردم لطفا پیام خصوصی و عمومی بدن که بنده اصلاح کنم باعث سردرگمی خلق خدا نشم

مرسی دوست عزیز
درست میگن ایشون.
نمیشه.
راه هاشم که فرمودن به صورت کلی...
همون آفست ساده ترین راهه.

Greatal
02-08-2013, 00:51
مرسی دوست عزیز
درست میگن ایشون.
نمیشه.
راه هاشم که فرمودن به صورت کلی...
همون آفست ساده ترین راهه.

که البته خودش به اندازه کافی پیچیده هست (اگر بخای چند مرحله تقویتش کنی) و تا حدی هم غیر قابل پیشبینی و قیر قابل اتمینان حد اقل برا آماتور هایی مثل من(که تجربه ای برای مدار درفرکانس بالا ندارم ) آقا خلاصه اگر راه داره برو از یه ADC اکسترنال استفاده کن خیرشو ببینی :hi:

alishekarriz
04-08-2013, 05:58
در اين مواقع ميگم:

صورت مسئله اصلي رو بگو .. اصل قضيه چيه كه فكر ميكني منفي بايدبخوني :0013:

spring110.sh
08-09-2013, 16:25
سلام دوستان . برای اینکه بتونم از 2 تا از کانالای ADC1 به صورت مجزا استفاده کنم ، چه دستوری هست که مقدار این 2 تا کانال ( کانال 0 و 1 adc ) رو درون 2 تا متغیر بریزه ؟؟؟
ممنون از لطفتون

spring110.sh
08-09-2013, 16:28
اینکه دستور برای گرفتن مقدار از یک کاناله :

a = ADC_GetConversionValue(ADC1);

اینم دستور پیکره بندی به صورت 2 کاناله !!!


ADC_InitStructure.ADC_NbrOfChannel =2;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0 |ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);

ممنون می شم راهنمایی کنید

spring110.sh
09-09-2013, 09:47
اینکه دستور برای گرفتن مقدار از یک کاناله :

a = ADC_GetConversionValue(ADC1);

اینم دستور پیکره بندی به صورت 2 کاناله !!!


ADC_InitStructure.ADC_NbrOfChannel =2;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0 |ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);

ممنون می شم راهنمایی کنید

خب از راهنمایی سرشار اساتید ممنونم ، من تو فروم سایت st خوندم که برای استفاده از 2 کانال به بعد باید DMA رو استفاده کنیم.
دستورات پیکره بندی dma و adc رو دارم ، اما یه قسمتاییش رو نمی دونم چیه ....

sjafarim
09-09-2013, 10:59
سلام
نگاه کن دوست عزیز
نحوه کار اینجوریه :
1- کلاک adc , dma رو فعال میکنی.
2- پایه های رو به صورت ورودی پیکربندی میکنی.
3- یک کانال adcرو برای کنترل adc انتخاب میکنید.
4- dma پیکربندی، کانال adc به ان نسبت داده شده و فعال می شود.
5- کانال adc پیکربندی شده، اینجا 2 تا ورودی adc رو برای کانال تعریف می کنی که کدوماست و ترتیبشون چیه.
6- کانالو فعال میکنی.
ازنجی به بعد باید از طریق وقفه dma یا همینجوری بی حساب کتاب مقدار adc رو از dma هر موقع خواستی بخونی.
هر جای کدی که داری مشکل داری مشخص کن دقیق توضیح بدم.

spring110.sh
09-09-2013, 16:35
سلام
نگاه کن دوست عزیز
نحوه کار اینجوریه :
1- کلاک adc , dma رو فعال میکنی.
2- پایه های رو به صورت ورودی پیکربندی میکنی.
3- یک کانال adcرو برای کنترل adc انتخاب میکنید.
4- dma پیکربندی، کانال adc به ان نسبت داده شده و فعال می شود.
5- کانال adc پیکربندی شده، اینجا 2 تا ورودی adc رو برای کانال تعریف می کنی که کدوماست و ترتیبشون چیه.
6- کانالو فعال میکنی.
ازنجی به بعد باید از طریق وقفه dma یا همینجوری بی حساب کتاب مقدار adc رو از dma هر موقع خواستی بخونی.
هر جای کدی که داری مشکل داری مشخص کن دقیق توضیح بدم.


این کد منه :

#include "stm32f10x.h"
#include <stdio.h>
#include "stm32f10x_ADC.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_dma.h"
#include "misc.h"
#include <delay.h>
#include <stdio.h>

//***************** initstructure 's AND Value parametr's****************
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
USART_InitTypeDef USART_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
int a=0,b=0,c=0,d=0,e=0;
int u1,u2,u3,u4,u5,u6,alarm;
int cooler , hitter ;
uint16_t ADCConvertedValue[2]; //Array that is used to store the calculated DMA values for ADC1
uint16_t temp1 , light;


//****************config port 's (GPIO) ***************************************
int main(void){

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//GPIOB
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ADC
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); //USART
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //DMA

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; // outpin
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);

//**** ADC pin's config
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //ADC
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //input pin
GPIO_Init(GPIOB, &GPIO_InitStruct);


// usart pin's config*******

GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);

//****************config ADC's ******************************************
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 =2;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0 |ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);

//*********config DMA **********************
DMA_DeInit(DMA1_Channel1); //Set DMA registers to default values
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) & ADCConvertedValue; //Variable to which ADC values will be stored
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2; //Buffer size (2 because we using two channels)
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); //Initialise the DMA
DMA_Cmd(DMA1_Channel1, ENABLE);

//*********start ADC_DMA************/
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);


//***************config USART ***********************************************
برای شلوغ نشدن برنامه حذف شد

//***************config timer *********************************************
برای شلوغ نشدن برنامه حذف شد


//***************config NVIC *********************************
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);



}
void bms1(void){
.
.
.
(statement's)
//*************** GPIO control ********************************************
.
.
.
.

while(1){


//*************** ADC control ***********************************************

temp1=ADCConvertedValue[0];
light=ADCConvertedValue[1];
}


متشکرم

spring110.sh
09-09-2013, 16:39
مشکلم تو همون قسمتیه که باید مقدار adc رو بخونیم و بریزیم تو 2 یا چند تا متغیر !
تو این روشی که من انجام دادم که کپی روشیه که تو سایت های st و ... دیدم ، خیلی واضح نیست نحوه کار . البته حدس می زنم مثلا مقادیر کانال 1 و 2 رو به ترتیب تو آرایه 1 و 2 قرار می ده . نمی دونم درسته یا نه !

sjafarim
09-09-2013, 18:01
پروژه زیر رو که 4 کانال adc رو همزمان میخونه و رو lcd n96 نشون میده برات آماده کردم، یه سری کامنت هم به صورت توضیحی توش برات گذاشتم، بخون باز اگر مشکلی داشتی مطرح کن.
اصول کلی کار اینه که وقتی از dma استفاده می کنی، دیگه شما دستور خواندن از adc رو نمیدی،dma خودش میره از adc میخونه و میریزه تو متغیری که براش تعیین کردی، بعد شما فقط کافیه اون متغییرو هرجا خواستی استفاده کنی، تو این پروژه از وقفه dma برای فهمیدن زمان دقیق هر آپدیت مقدار استفاده نشده تا راحتت تر باشه و تو یه حلقه بینهایت فقط مقادیر هی خونده میشن و نمایش داده میشن.
موفق باشید:
You can see links before reply

spring110.sh
09-09-2013, 20:16
آقا ممنون . کارت خیلی درسته . بازم مزاحم می شم

spring110.sh
09-09-2013, 21:04
پروژه زیر رو که 4 کانال adc رو همزمان میخونه و رو lcd n96 نشون میده برات آماده کردم، یه سری کامنت هم به صورت توضیحی توش برات گذاشتم، بخون باز اگر مشکلی داشتی مطرح کن.
اصول کلی کار اینه که وقتی از dma استفاده می کنی، دیگه شما دستور خواندن از adc رو نمیدی،dma خودش میره از adc میخونه و میریزه تو متغیری که براش تعیین کردی، بعد شما فقط کافیه اون متغییرو هرجا خواستی استفاده کنی، تو این پروژه از وقفه dma برای فهمیدن زمان دقیق هر آپدیت مقدار استفاده نشده تا راحتت تر باشه و تو یه حلقه بینهایت فقط مقادیر هی خونده میشن و نمایش داده میشن.
موفق باشید:
Download 4 chanal adc with DMA STM32.rar (You can see links before reply)


آقای جعفری فقط یک سوال ، این آرایه 4 بعدی که تعریف کردید ، موقعی که dma می خواد مقدار هر کانال رو درونش قرار بده به چه شکل کار می کنه ؟ به عبارتی یعنی برای مثال به ترتیب کانال 0 روی متغیر0 ، کانال 1 روی متغیر1 و ... ؟؟؟ منم هر جا خواستم استفاده کنم از مقدار هر کانال مقدار اون متغیر رو استفاده کنم ؟
ممنون

sjafarim
09-09-2013, 21:11
دقیقا به همون ترتیبی که با دستور ADC_RegularChannelConfig کانال هارو به adc1 متصل کردی تو آرایه قرار میگیره که ما اینجا 0رو به 1، 1 رو به 2 و... متصل کردیم. (اون یک و دو صرفا ترتیب قرارگیری مقادیر در کانال adc1 هست)
پس مقدار کانال 0 تو متغیر

ADC_ConvertedValue[0]
قرار داره و میتیونی هرجا خواستی ازین متغییر استفاده کنی که آخرین مقدار تحویلی از adc توش قرار داده شده توسط dma.

spring110.sh
10-09-2013, 09:37
خیلی ممنون مهندس . سایه عالی مستدام !:hi:

Greatal
09-11-2013, 10:23
سلام چندی پیش من خدمت دوست عزیز مون گفتم نمی شه مقدار منفی رو با ADC میکرو ST خوند که کاملا" هم درسته اما راه حلی هست که می تونه این مشکل رو نسبتا حل کنه اون هم به این صورته که شما سیگنال رو به دوتا آپ امپ می دید یکی به ورودی عادی یکی هم به ورودی معکوس کننده از آپ امپ معمولی یخ خروجی تریگر شامیتی میگیدید و مدید به یه پین اگر مثبت بود آپ امپ پایه مثبت و اگر منفی بود پایه معکوس کننده رو می خونید برای این کار هم می تونید از دوتا پایه ADC میکرو استفاده کنید یا همون خروجی تریگر اشمیت رو به یه سویچ سرعت بالی آنالوگ بدید که معمولا" نسبتا گرون هستند تازه حدود 10ns هم زمانه سویچشونه دوستان اگر خواستن از این روش استفاده کنند توجهه داشته باشند باید از آپ های چاپر استفاده کنند یا آپ امپ زیرو دیفت سرعت بالا که این هم به نوبه خودش در مورد سیگنال های DC و فرکانس کمتر از 150Hz باعث نویز بالایی در خروجی آپ امپ میشه که قابل حل نیست حد اقل من که نتونستم!امید وارم به کار دوستان بیاد

mahdi8866
09-11-2013, 16:17
سلام
هر واحد adc در میکرو که قابلیت bipolar داشته باشه میتونه ولتاژ منفی رو بخونه