1V Sinüs Sinyal Algılama

Başlatan Proteus, 29 Mayıs 2021, 17:34:42

Proteus

Kolay gelsin 230VAC şebekeden gerilim bölücü direnç formuyla 1,14V RMS sinüs elde ediyorum elde ettiğim bu sinyalin sadece olup olmadığını görmek istiyorum.

Bunu nasıl yapabilirim Analog watchdog sanırım bu işi çözer.Harici olarak kendimde şöyle birşeyler yaptım.  ADC değeri 0 gördüğünde timer başlasın 100ms boyunca sıfır değeri geldiği zaman port aktifleşsin

HAL_ADC_Start_DMA(&hadc,(uint32_t*) AdcValArray,6);

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
	
{
	
  if(hadc->Instance == ADC1){
		AdcValArray[0] = AdcValArrayBuffer[0];
		AdcValArray[1] = AdcValArrayBuffer[1];
		AdcValArray[2] = AdcValArrayBuffer[2];
		AdcValArray[3] = AdcValArrayBuffer[3];
		AdcValArray[4] = AdcValArrayBuffer[4];
		AdcValArray[5] = AdcValArrayBuffer[5];
		
		if(AdcValArrayBuffer[0]==0)
		{
			if(time1 == 0)
				time1 =  HAL_GetTick();
		}
		if(AdcValArrayBuffer[1] == 0)
		{
			if(time2 == 0)
				time2 =  HAL_GetTick();
		}
		if(AdcValArrayBuffer[2] == 0)
		{
			if(time3 == 0)
				time3 =  HAL_GetTick();
		}
		if(AdcValArrayBuffer[3] == 0)
		{
			if(time4 == 0)
				time4 =  HAL_GetTick();
		}
		if(AdcValArrayBuffer[4] == 0)
		{
			if(time5 == 0)
				time5 =  HAL_GetTick();
		}
		if(AdcValArrayBuffer[5] == 0)
		{
			if(time6 == 0)
				time6 =  HAL_GetTick();
		}
		
		
  }
while (1)
  {
		
		if(AdcValArray[0] == 0 )
	{
		if(HAL_GetTick() - time1 >100)
		{
			//alarm 
		}
	}
	else
	{
		time1 = 0;
	}
	if(AdcValArray[1] == 0 )
	{
		if(HAL_GetTick() - time2 >100)
		{
			
  HAL_GPIO_WritePin(GPIOA, L1_Pin, GPIO_PIN_SET);
		}
	}
	else
	{
		time2 = 0;
		  HAL_GPIO_WritePin(GPIOA, L1_Pin, GPIO_PIN_RESET);

	}
	if(AdcValArray[2] == 0 )
	{
		if(HAL_GetTick() - time3 >100)
		{
			//alarm 
		}
	}
	else
	{
		time3 = 0;
	}
	if(AdcValArray[3] == 0 )
	{
		if(HAL_GetTick() - time4 >100)
		{
			//alarm 
		}
	}
	else
	{
		time4 = 0;
	}
	if(AdcValArray[4] == 0 )
	{
		if(HAL_GetTick() - time5 >100)
		{
			//alarm 
		}
	}
	else
	{
		time5 = 0;
	}
	if(AdcValArray[5] == 0 )
	{
		if(HAL_GetTick() - time6 >100)
		{
			//alarm 
		}
	}
	else
	{
		time6 = 0;
	}
	 
  }


z

#1


Gelisiguzel bir zamanda ADC den okuyacagin deger 1v yada alti ise gerilim var demektir.

4V ve ustu varsa elektrik yok.

Ara degerleri gormezden gel.

ARM demissin gormemisim. 5V yerine 3V3 uygulaman gerekecek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Proteus

Alıntı yapılan: z - 29 Mayıs 2021, 18:22:13

Gelisiguzel bir zamanda ADC den okuyacagin deger 1v yada alti ise gerilim var demektir.

4V ve ustu varsa elektrik yok.

Ara degerleri gormezden gel.

ARM demissin gormemisim. 5V yerine 3V3 uygulaman gerekecek.

çok teşekkürler mevcut hw üzerinden giderek nasıl yapılabilir sadece yazılım ile.

z

#3
Timer ile mesela her 4 ms de ADC yi tetiklet ve 5 ardisil ADC olcumlerini depola. 

3v 0x4000 ise

[ABS(V1-0x2000)+ABS(V2-0x2000)+ABS(V3-0x2000)+ABS(V4-0x2000)+ABS(V5-0x2000)]/5 isleminin sonucu 0x2000 den yeterince buyukmu bak.

Buradaki V1,...V5 voltajlarin ADC sonuc degeri.

Analog Watchdog istedigin ise cok uygun degil.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Proteus

Alıntı yapılan: z - 30 Mayıs 2021, 11:17:53Timer ile mesela her 4 ms de ADC yi tetiklet ve 5 ardisil ADC olcumlerini depola. 

3v 0x4000 ise

[ABS(V1-0x2000)+ABS(V2-0x2000)+ABS(V3-0x2000)+ABS(V4-0x2000)+ABS(V5-0x2000)]/5 isleminin sonucu 0x2000 den yeterince buyukmu bak.

Buradaki V1,...V5 voltajlarin ADC sonuc degeri.

Analog Watchdog istedigin ise cok uygun degil.


Tekniği tam olarak anlayamadım neden 0x2000 çıkarıyoruz ADC sample ölçümlerinden ve ABS derken neyi kastediyorsunuz.
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{


if (htim==&htim3){  //4ms TIMER INT
		  HAL_ADC_Start(&hadc); //ADC START	
		
     if (HAL_ADC_PollForConversion(&hadc,5)==HAL_OK)	
			 
    for (count = 0 ; count < 5 ; count++ )  //4ms * 5 SAMPLE =20mS 1 period
	
	    	 {					 
//					adc_raw_data[count] = AdcValArray[1];
					  adc_raw_data[count] = HAL_ADC_GetValue(&hadc);
					 
		  	 }	
			for (count = 0 ; count < 5 ; count++ )  
    	 {					 
										  totalValue += adc_raw_data[count];  
	  	 }											 
					if (count==5)
						 { 
						  	totalValueDivide = totalValue/5;
							  totalValue=0;		 
						 }			 

}
	 HAL_ADC_Stop(&hadc);		

}
Bu şekilde birşeyler yaptım STMstudio değişkeni izliyorum 0 değerine düşüyor bu da istenmeyen bir durum kontrolüm için

z

Sebeke gerilmi yokken ADC den 1.5V okuyacaksin. Sebeke geldimi okuyacagin degerler 0 ile 3v arasinda degisecek.

3v 4095 olarak okunur. Bu da 0x0FFF olarak okunur. Tam yarisi 0x800 0 volta kasi gelir.

ADC den 4ms araliklarla 5 ornek alirsan bir peryodu orneklemis olursun.

Eger sebeke yoksa aldigin 5 ornek de 0x800 civarindadir. Ama sebeke varsa ADC - 0x800 farki 0x800 den farkli olur. Hep pozitif hem de negatif ark olusur. Bunlarin mutlak degerlerinin toplaminin 5 e bolumu 0x800 den uzaklasir. Dolayisi ile voltaj varmi yokmu karari kolay olur.

Ilk mesajimda mantigi anlatabilmek icin 3v a 0x4000 demistim. Simdi 3v a 0xFFF dedim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com