semih_s
Hobici
- Katılım
- 16 Aralık 2020
- Mesajlar
- 1,861
Merhaba. Daha evvel kolayca çalıştırdığım enkoder modu şu anda çalışmıyor ve nedenini anlayamıyorum. MIG kaynak mak. motoru için yaptığım testte enkoderi input olarak kullanıyordum.
Şimdi bir türlü çalıştıramadım.
Enkoder sinyalini mcu bacaklarından kontol ettim ve aşağıdaki gibi:
cube ide kullanıyorum.
tim4 için konfigürasyonum aşağıdaki gibi:
Kullandığım TIM4 init kodu aşağıdaki gibi, bu kod ide'nin ürettiği kod.
Aşağıdaki kodu, sorunu tespit etmek için hazırladım. Enkoderi okuduğum döngüde, döngünün çalıştığını görmek için bir de sayaç var:
Döngü çalışıyor- TIM4->CNT' ye atadığım değeri okuyup yazdırabiliyorum, saniye sayacı çalışıyor ama enkoder modda olmasına rağmen enkoder hareketlerine tepki vermiyor.
Neyi gözden kaçırıyorum?
Mig-mag kaynak makinesi modifikasyonu.
Motoru böyle sürüyorum, fren de var, orjinal devrede de vardı. Akım trafosunu aşağıdaki gibi okuyorum. Voltajı böyle okuyorum. LCD'yi böyle sürüyorum. Bunun için non-blocking 8bit moda çalışan i2c-karakter lcd kütüphanesi hazırladım. PCF8574 kütüphaneleri ekrana bir şey yazdırırken...
mekatronik.org
Şimdi bir türlü çalıştıramadım.
Enkoder sinyalini mcu bacaklarından kontol ettim ve aşağıdaki gibi:
cube ide kullanıyorum.
tim4 için konfigürasyonum aşağıdaki gibi:
Kullandığım TIM4 init kodu aşağıdaki gibi, bu kod ide'nin ürettiği kod.
TIM4:
/* TIM4 init function */
void MX_TIM4_Init(void)
{
/* USER CODE BEGIN TIM4_Init 0 */
/* USER CODE END TIM4_Init 0 */
TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM4_Init 1 */
/* USER CODE END TIM4_Init 1 */
htim4.Instance = TIM4;
htim4.Init.Prescaler = 0;
htim4.Init.CounterMode = TIM_COUNTERMODE_DOWN;
htim4.Init.Period = 65535;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 0;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sConfig.IC2Filter = 0;
if (HAL_TIM_Encoder_Init(&htim4, &sConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM4_Init 2 */
/* USER CODE END TIM4_Init 2 */
}
Aşağıdaki kodu, sorunu tespit etmek için hazırladım. Enkoderi okuduğum döngüde, döngünün çalıştığını görmek için bir de sayaç var:
main:
int main(void)
{
HAL_Init();
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C1_Init();
MX_I2C2_Init();
MX_TIM1_Init();
MX_TIM4_Init();
MX_TIM3_Init();
MX_ADC1_Init();
MX_ADC2_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_Delay(10);
lcd_init();
lcd_backlight(1);
lcd_enable(1);
HAL_Delay(100);
TIM4->CNT=1000;
TIM1_1MHZ_Init();
while(ENKODER_BUTON_OKU) // enkoder tuşuna basılana kadar çalışır.
{
if(TIM1->CNT>2499) // 2.5ms periyotta çalışır.
{
TIM1->CNT=0;
lcd_tarama();
bufferu16_1=TIM4->CNT;
lcd_print_cur(0,0,"TIM4->CNT=");
lcd_print_int(bufferu16_1,5);
lcd_print_cur(1,0,"sayaç:");
lcd_print_int((bufferu16_0++)/400,6);
}
}
Döngü çalışıyor- TIM4->CNT' ye atadığım değeri okuyup yazdırabiliyorum, saniye sayacı çalışıyor ama enkoder modda olmasına rağmen enkoder hareketlerine tepki vermiyor.
Neyi gözden kaçırıyorum?