<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=46&amp;t=20124&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-01-31T21:42:33+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=20124&amp;mode</id>
<entry>
<author><name><![CDATA[LesterNowicjusz]]></name></author>
<updated>2018-01-31T21:42:33+01:00</updated>
<published>2018-01-31T21:42:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20124&amp;p=203057#p203057</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20124&amp;p=203057#p203057"/>
<title type="html"><![CDATA[[STM32F103] [C] - Silnik krokowy startuję po 1 minucie.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20124&amp;p=203057#p203057"><![CDATA[
Cześć. Napisałem sterownik silnika krokowego z wykorzstaniem DMA i TIM1. Sygnał przyspieszam z wykorzystaniem tzw. Rampy. Czasy sobie wyliczam i ładuje do tablicy DMA i przekazuje z niej do wartości TIM PERIOD. Program działa jak należy(przyspiesza i hamuje z zasadą rampy), ale martwi mnie to dlaczego Timer zaczyna pracować dopiero po 1 minucie. Podejrzewam, że to przez obliczenia bo jak bez tych wartości ładuje randomowe wartości to działa od razu. Czy mogę sprawić aby ten demon prędkości uruchomił TIMER trochę szybciej? Czy nic nie zrobię. Dla zainteresowanych wklejam kod. <br /><br />[syntax=c]#include &quot;stm32f10x.h&quot;<br />#include &quot;stm32f1xx_nucleo.h&quot;<br />#include &quot;stm32f10x.h&quot;<br /><br />#include &lt;math.h&gt;<br /><br />int i = 0;<br /><br />//============Dane==========<br />float vMin = 1.0;<br />float vMax = 10.0;<br /><br />int accelerationTime = 10;<br />int decelerationTime = 10;<br /><br />volatile int totalSteps = 100;<br />volatile int currentStep = 0;<br />//============Szukane==========<br />float accelerationPerMs = 0;<br />float decelerationPerMs = 0;<br /><br />int stepsAcceleration = 0;<br />int stepsDeceleration = 0;<br /><br />//============================<br />float currentSpeed = 0.0;<br />int period = 0;<br />u16 PWM_Buf&#91;100&#93;;<br /><br />void TIMInit(void);<br />void GPIOInit(void);<br />void DMAInit(void);<br />void PWMInit(void);<br />void generateSignal(int totalSteps, float vMin, float vMax,int accelerationTime, int decelerationTime);<br /><br />int main(void) {<br />GPIOInit();<br />TIMInit();<br />DMAInit();<br />PWMInit();<br />generateSignal(totalSteps,vMin,vMax,accelerationTime,decelerationTime);<br /><br />while (1) {<br />}<br />}<br />void generateSignal(int totalSteps, float vMin, float vMax,int accelerationTime, int decelerationTime) {<br /><br />accelerationPerMs = (vMax - vMin) / (accelerationTime);<br />decelerationPerMs = (vMax - vMin) / (decelerationTime);<br /><br />stepsAcceleration = ceil(((vMin * accelerationTime) +<br />(accelerationPerMs * (accelerationTime * accelerationTime)) / 2));<br />stepsDeceleration = ceil(((vMin * decelerationTime) +<br />(decelerationPerMs * (decelerationTime * decelerationTime)) / 2));<br /><br />if (totalSteps &lt;= stepsAcceleration + stepsDeceleration)<br />totalSteps = stepsAcceleration + stepsDeceleration + 1;<br />for (currentStep = 0; i &lt; totalSteps; currentStep++){<br />if(currentStep == 0)<br />currentSpeed = vMin;<br />else if(currentStep &lt; stepsAcceleration)<br />currentSpeed += accelerationPerMs;<br />else if(currentStep &gt;= stepsAcceleration)<br />currentSpeed = vMax;<br />else if(currentStep &gt;= totalSteps - stepsDeceleration)<br />currentSpeed -= decelerationPerMs - 1;<br />period = 1000/currentSpeed;<br />PWM_Buf&#91;currentStep&#93; = period;<br />}<br />}<br />void TIMInit(void) {<br />TIM_TimeBaseInitTypeDef TIMInit;<br /><br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);<br /><br />//TIMInit.TIM_Period = 1000 - 1;<br />TIMInit.TIM_Prescaler = 64000 - 1;<br />TIMInit.TIM_ClockDivision = TIM_CKD_DIV1;<br />TIMInit.TIM_CounterMode = TIM_CounterMode_Up;<br />TIMInit.TIM_RepetitionCounter = 0;<br /><br />TIM_TimeBaseInit(TIM1, &amp;TIMInit);<br />}<br /><br />void GPIOInit(void) {<br />GPIO_InitTypeDef GPIOInit;<br /><br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);<br />RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);<br /><br />GPIOInit.GPIO_Pin = GPIO_Pin_8;<br />GPIOInit.GPIO_Mode = GPIO_Mode_AF_PP;<br />GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;<br /><br />GPIO_Init(GPIOA, &amp;GPIOInit);<br />}<br /><br />void DMAInit(void) {<br /><br />DMA_InitTypeDef DMAInit;<br />RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);<br />DMA_DeInit(DMA1_Channel5);<br />DMAInit.DMA_PeripheralBaseAddr = (u32)&amp;TIM1 -&gt; ARR;<br />DMAInit.DMA_MemoryBaseAddr = (u32) PWM_Buf;<br />DMAInit.DMA_DIR = DMA_DIR_PeripheralDST;<br />DMAInit.DMA_BufferSize = totalSteps;<br />DMAInit.DMA_PeripheralInc = DMA_PeripheralInc_Disable;<br />DMAInit.DMA_MemoryInc = DMA_MemoryInc_Enable;<br />DMAInit.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;<br />DMAInit.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;<br />DMAInit.DMA_Mode = DMA_Mode_Circular;<br />DMAInit.DMA_Priority = DMA_Priority_High;<br />DMAInit.DMA_M2M = DMA_M2M_Disable;<br />DMA_Init(DMA1_Channel5, &amp;DMAInit);<br /><br />DMA_Cmd(DMA1_Channel5, ENABLE);<br />}<br /><br />void PWMInit(void) {<br />TIM_OCInitTypeDef PWMInit;<br /><br />PWMInit.TIM_OCMode = TIM_OCMode_PWM1;<br />PWMInit.TIM_OutputState = TIM_OutputState_Enable;<br />PWMInit.TIM_Pulse = 30;<br />PWMInit.TIM_OCPolarity = TIM_OCPolarity_High;<br />TIM_OC1Init(TIM1, &amp;PWMInit);<br />//TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);<br />//TIM_ARRPreloadConfig(TIM1, ENABLE);<br />TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);<br />TIM_Cmd(TIM1, ENABLE);<br />TIM_CtrlPWMOutputs(TIM1, ENABLE);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18919">LesterNowicjusz</a> — 31 sty 2018, o 21:42</p><hr />
]]></content>
</entry>
</feed>