---------------------------------------------------------------------------- -- | -- Module : App.Stepper -- Copyright : (c) Marc Fontaine 2017 -- License : BSD3 -- -- Maintainer : Marc.Fontaine@gmx.de -- Stability : experimental -- Portability : GHC-only -- -- Stepper motor control. (GPIO bit-banging) -- This example uses bit-banging to toggle two GPIO pins. -- It does not show a special STM32 feature. -- (But I just wanted to test a stepper motor) module App.Stepper where import Control.Monad import STM32.API import STM32.GPIO as GPIO data Direction = CW | CCW deriving (Show,Eq) -- | Rotatet the stepper motor a number of steps clock wise or conter clock wise. runStepper:: Direction -> Int -> IO () runStepper = runStepperDelay 25000 runStepperDelay :: Int -> Direction -> Int -> IO () runStepperDelay pause dir steps = runMI $ do let port = GPIOB dirWire = (port,Pin_2) stepWire = (port,Pin_1) initMI resetHalt peripheralClockOn port pinMode dirWire $ GPOutPushPull Mhz_2 pinMode stepWire $ GPOutPushPull Mhz_2 case dir of CW -> pinHigh dirWire CCW -> pinLow dirWire replicateM_ steps $ do delay pause pinHigh stepWire delay pause pinLow stepWire