STM32F4 ADC verisi ile Led parlaklık kontrolü

Başlatan jankilodvandam, 07 Şubat 2017, 16:27:43

jankilodvandam

Merhaba abiler.

Keil ve CubeMX programlarını kullanıyorum stm32f4 disco geliştirme kartımı kullanırken.

Sharp sensörümden aldığım veri ile disco kartının üzerindeki ledlerin parlaklıklarını kontrol etmek istiyorum ancak internette böyle bir örneğe rastlamadım malesef. Timer4 ile pwm üretip mi yapmam gerekir yoksa sadece timer kullanmak yeterli olur mu, yoksa bambaşka bir şey mi?.

bu konuda çalışmış/bilgisi olanlardan yardımlarınızı bekliyorum en ufak bir bilgi de değerlidir benim için.

teşekkürler. :)

muhittin_kaplan


jankilodvandam

Alıntı yapılan: muhittin_kaplan - 07 Şubat 2017, 16:46:34
pwm ile  parlaklığı ayarlayabilirsin.

https://www.picproje.org/index.php/topic,68158.0.html


hocam biraz daha detaylandırabilir misiniz rica etsem. videoları izledim ancak pwm ve adc nin bir arada kullanıldığı yok sanırım.

muhittin_kaplan

Hocam ADC mevcut, PWM de mevcut. Yapılması gereken ADC deki okunan veriyi PWM e aktarmak.

jankilodvandam

Alıntı yapılan: muhittin_kaplan - 07 Şubat 2017, 17:33:00
Hocam ADC mevcut, PWM de mevcut. Yapılması gereken ADC deki okunan veriyi PWM e aktarmak.


teşekkürler.

furkanyx

#5
ADC(12bit) maksimum 4095 değerini okur, sende Timerin periyot değerini 4095 yaparsın ve adc den okuduğun değeri TIM_SetCompareX(TIMx,dutyDegeri) gibi bir fonksiyona adc den gelen değeri dutyDegerine yazarsan ADC den okuğun değer ile ledin parlaklığını değiştirmiş olursun.

edit: HAL kütüphanesin de birebir "TIM_SetCompareX(TIMx,dutyDegeri)"  böyle bir fonksiyon var mı bilmiyorum. Ama muhtemelen bu ifadeye yakın birşeydir.

muhittin_kaplan

TIM4->CCR1=ADCDegeri

TIM4 pwm üreten Timer
CCR1, TIM4 un 1.kanalı (PD12 ye bağlı)

muhittin_kaplan

__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwmDeğeri);

jankilodvandam

Alıntı yapılan: muhittin_kaplan - 08 Şubat 2017, 01:01:37
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwmDeğeri);
Alıntı yapılan: furkanyx - 08 Şubat 2017, 00:07:15
ADC(12bit) maksimum 4095 değerini okur, sende Timerin periyot değerini 4095 yaparsın ve adc den okuduğun değeri TIM_SetCompareX(TIMx,dutyDegeri) gibi bir fonksiyona adc den gelen değeri dutyDegerine yazarsan ADC den okuğun değer ile ledin parlaklığını değiştirmiş olursun.

edit: HAL kütüphanesin de birebir "TIM_SetCompareX(TIMx,dutyDegeri)"  böyle bir fonksiyon var mı bilmiyorum. Ama muhtemelen bu ifadeye yakın birşeydir.

Kusura bakmayın geç görüyorum...
_____________________________________________________________________________
   HAL_ADC_Start(&hadc1);
   HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
   
  while (1)
  {
      adc_data = HAL_ADC_GetValue(&hadc1);
      __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,adc_data);
  }
_____________________________________________________________________

dediğiniz gibi, bu şekilde yapmıştım ben de.




furkanyx


jankilodvandam

adc periyot değeri derken timer4 ün periyot unu kastettiniz sanırım. Onu biraz deneme yanılmayla yaptım. periyot 200 ile minimum mesafede maksimum parlaklığa ulaştım..


Prescaler,Period ve Pulse değerlerinde olması gerekenler hakkında bilgisi olan varsa lütfen yazsın.

Cemre.

#11
[latex]Timer Freq (Hz) = \frac{Timer Clock Freq (Hz)}{(Prescaler+1)\cdot(ARR+1)}[/latex]

Pulse değeri 0 ile ARR değeri arasında olmak zorundadır. PWM sinyalinizin doluluk oranını (Duty) belirtir.

furkanyx

Pardon Timer diyecektim :)

72Mhz de kullanıyorsan 72-1 = 71 yap prescaler değerini bunun çok büyük önemi yok led pwm i için ama olabilidiğince küçük olsa daha iyi olur.
Periyot değerini de 4095 yap.
Pulse yani duty değerini de başlangıç olarak 0 yapabilirsin daha sonra bu değeri adc den okuduğun değer ile güncelleyebilirsin.