Merhabalar
stm32f4 kite dışarıdan pwm uygulayıp bu sinyaldeki değişimleri ölçmek istiyorum. Daha sonra ise eş zamanlı olarak bir grafik çizdircem. Forumda pwm input ile çalışmış bir kaç konu var ama sağlıklı nihayetlenmemiş sanırım. Datasheette pwm input için şöyle diyor "For example, you can measure the period (in TIMx_CCR1 register) and the duty cycle (in TIMx_CCR2 register) of the PWM applied on TI1 using the following procedure (depending on CK_INT frequency and prescaler value)" fakat input capture ile de uygulama yapılabilir mi?
Sinyalin doluluk oranını ölçmek istiyorsunuz anladığım kadarıyla. Register değerlerini değiştirerek bunu sağlayabilirsin.
PIC'te böyle bir uygulama yaptım. Gayet kararlı çalışıyor.
http://elektrokod.wordpress.com/2014/01/23/ultrasonik-mesafe-sensoru-uygulamasi-3/ (http://elektrokod.wordpress.com/2014/01/23/ultrasonik-mesafe-sensoru-uygulamasi-3/)
STMde daha kararlı yapılabilir.
Hocam sinyaldeki değişiklikler için doluluk oranının değişimini mi takip etmeliyim grafik bu orana göre mi çizilmeli?
birim zamandaki değişiklik mi? Yoksa değişiklik olduğu zamanını kaydedilmesi şeklinde mi düşünüyorsunuz?
Selim hocam çıkışı pwm sinyal olan sensörü stm kite bağlıcam ve değişikliklerini eş zamanlı olarak görmek istiyorum inşallah olursa c# ta küçük bir arayüz ile bu değişikleri hemen grafikte göstermek istiyorum aynı ekg projeleri gibi anlık değişiklikler.
Şöyle bir örnek buldum
volatile int IC3ReadValue1 = 0;
volatile int IC3ReadValue2 = 0;
volatile int Capture = 0;
volatile int CaptureNumber = 0;
volatile int dataCaptureReady = 0;
void tim3ConfigRising()
{
TIM_ICInitTypeDef timICStruct;
timICStruct.TIM_Channel = TIM_Channel_2;
timICStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
timICStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
timICStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
timICStruct.TIM_ICFilter = 0x0;
TIM_ICInit(TIM3, &timICStruct);
}
void tim3ConfigFalling()
{
TIM_ICInitTypeDef timICStruct;
timICStruct.TIM_Channel = TIM_Channel_2;
timICStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;
timICStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
timICStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
timICStruct.TIM_ICFilter = 0x0;
TIM_ICInit(TIM3, &timICStruct);
}
void initTimers()
{
TIM_TimeBaseInitTypeDef base_timer;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructInit(&base_timer);
base_timer.TIM_Prescaler = SystemCoreClock / 1000 - 1;
base_timer.TIM_Period = 2000;
base_timer.TIM_ClockDivision = 0;
base_timer.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &base_timer);
tim3ConfigRising();
// TIM enable counter
TIM_Cmd(TIM3, ENABLE);
// Enable the CC2 Interrupt Request
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void initGpio()
{
GPIO_InitTypeDef gpioStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
gpioStruct.GPIO_Mode = GPIO_Mode_IN;
gpioStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpioStruct.GPIO_Speed = GPIO_Speed_50MHz;
gpioStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOA, &gpioStruct);
}
int main(void)
{
char buffer[20];
int TIM3Freq;
initGpio();
initTimers();
while(1)
{
if (dataCaptureReady)
{
/* Capture computation */
if (IC3ReadValue2 > IC3ReadValue1)
{
Capture = (IC3ReadValue2 - IC3ReadValue1);
}
else
{
Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
}
/* Frequency computation */
TIM3Freq = (uint32_t) SystemCoreClock / Capture;
dataCaptureReady = 0;
//
}
}
}
void TIM3_IRQHandler()
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)
{
/* Clear TIM3 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
if(CaptureNumber == 0)
{
/* Get the Input Capture value */
IC3ReadValue1 = TIM_GetCapture2(TIM3);
CaptureNumber = 1;
tim3ConfigFalling();
}
else if(CaptureNumber == 1)
{
/* Get the Input Capture value */
IC3ReadValue2 = TIM_GetCapture2(TIM3);
dataCaptureReady = 1;
CaptureNumber = 0;
tim3ConfigRising();
}
}
}
main deki Capture değişkeninin tuttuğu değere göre grafik çizdirebilirim sanırım.
https://www.picproje.org/index.php/topic,49139.0.html (https://www.picproje.org/index.php/topic,49139.0.html)
Örnek CM3 için. ancak CM4 ile çalışmaması için bir neden yok. en fazla bir iki register ve port aarları değişir.
Hocam konuyu incelemiştim fakat işlemcim f4 diye pek bakmamıştım. Gerekli değişiklikleri yaptım ancak RCC_PLLConfig(RCC_CFGR_PLLSRC_HSI_Div2,RCC_CFGR_PLLMULL12);
fonksiyon satırında
error: #20: identifier "RCC_CFGR_PLLSRC_HSI_Div2" is undefined
error: #20: identifier "RCC_CFGR_PLLMULL12" is undefined
error: #165: too few arguments in function call
şeklinde hata alıyorum
stm32f4xx.rcc kütüphanesinde bulunan fonksiyon ile parametreler tutmuyor.
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)
Init_Clock() fonksiyonunu tamamen kaldırabilirsiniz. O kısım STM32F103 için internal clock ayarları. Kullanmanıza gerek yok.
Arkadaşlar Ben ARM ile SPWM üretmek istiyorum. Bu konuda ACİL..! yardıma ihtiyacım var. Mail Adresim: slmngzl@gmail.com