This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
en:iot-open:practical:hardware:sut:stm32:emb10_1 [2024/04/10 18:01] – [Suggested Readings and Knowledge Resources] ktokarz | en:iot-open:practical:hardware:sut:stm32:emb10_1 [2024/04/10 19:09] (current) – [EMB10: Controlling standard servo] ktokarz | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
- | You will learn how to control a standard miniature servo with the STM32 System on Chip. Standard miniature analogue servo is controlled with a PWM signal of frequency 50Hz with a duty cycle period between 1 ms (rotate to 0) and 2 ms (rotate to 180 degrees), where 1.5 ms corresponds to 90 degrees. | + | You will learn how to control a standard miniature servo with the STM32 System on Chip. Standard miniature analogue servo is controlled with a PWM signal of frequency 50Hz with a duty cycle period between 1 ms (rotate to 0) and 2 ms (rotate to 180 degrees), where 1.5 ms corresponds to 90 degrees. Some servos have other duty cycle minimum and maximum values, always refer to the documentation. |
<note warning> | <note warning> | ||
A servo has a red arrow presenting the gauge' | A servo has a red arrow presenting the gauge' | ||
Line 8: | Line 8: | ||
A good understanding of the PWM signal and duty cycle is necessary. In this scenario, we use built-in timers to control the PWM hardware channels of the STM32WB55 chip. In this case, we do not use any external library; instead, we use the hardware timer library built in the Arduino Core STM32 framework for STM32WB55 (stm32duino)((" | A good understanding of the PWM signal and duty cycle is necessary. In this scenario, we use built-in timers to control the PWM hardware channels of the STM32WB55 chip. In this case, we do not use any external library; instead, we use the hardware timer library built in the Arduino Core STM32 framework for STM32WB55 (stm32duino)((" | ||
\\ | \\ | ||
- | Some servos tend to go below 1 ms and above 2 ms to achieve a full 180-degree rotation range. If there is a need for a high accuracy of rotation, it is possible to fine-tune the minimum and maximum duty cycle values. | + | Some servos tend to go below 1 ms and above 2 ms to achieve a full 180-degree rotation range. For example, the servo in our laboratory (MG90/SG90) accepts values starting from 500 ms, and ending at 2500 ms. If there is a need for a high accuracy of rotation, it is possible to fine-tune the minimum and maximum duty cycle values. |
===== Suggested Readings and Knowledge Resources ===== | ===== Suggested Readings and Knowledge Resources ===== | ||
Line 23: | Line 23: | ||
==== Start ==== | ==== Start ==== | ||
- | In the laboratory equipment, the servo and the fan are connected to the same hardware timer instance. It means that both elements use the same base frequency of the PWM signal. If you use a fan and servo in the same project the frequency of the PMW signal | + | In the laboratory equipment, the servo and the fan are connected to the same hardware timer instance. It means that both elements use the same base frequency of the PWM signal. If you use a fan and servo in the same project the frequency of the PMW signal |
\\ | \\ | ||
The hardware timer library implements functions which allow us to control the duty cycle of the PWM signal and express it in different formats, including percentages. In the case of setting the PWM duty cycle expressed in percentages, | The hardware timer library implements functions which allow us to control the duty cycle of the PWM signal and express it in different formats, including percentages. In the case of setting the PWM duty cycle expressed in percentages, | ||
Line 45: | Line 45: | ||
HardwareTimer *MyTimServo; | HardwareTimer *MyTimServo; | ||
</ | </ | ||
- | |||
- | MG 90 servos that we use in our lab are specific. As mentioned above, to achieve a full 180-degree rotation range, their minimum and maximum duty cycle timings go far beyond standards. We will create function for calculating the duty cycle for the servo with the angle as the input parameter. | ||
- | |||
=== Step 2 === | === Step 2 === | ||
Line 53: | Line 50: | ||
Create the timer instance type based on the servo pin: | Create the timer instance type based on the servo pin: | ||
+ | |||
+ | <code c> | ||
+ | TIM_TypeDef *SRVInstance = (TIM_TypeDef *)pinmap_peripheral(digitalPinToPinName(SERVO_PWM_PIN), | ||
+ | </ | ||
< | < | ||
The same timer is used for the fan in the scenario STM_1A. | The same timer is used for the fan in the scenario STM_1A. | ||
</ | </ | ||
- | <code c> | ||
- | TIM_TypeDef *SRVInstance = (TIM_TypeDef *)pinmap_peripheral(digitalPinToPinName(SERVO_PWM_PIN), | ||
- | </ | ||
Define the channel for servo: | Define the channel for servo: | ||
Line 72: | Line 70: | ||
Configure and start PWM | Configure and start PWM | ||
<code c> | <code c> | ||
- | MyTimServo-> | + | MyTimServo-> |
</ | </ | ||
=== Step 3 === | === Step 3 === | ||
- | Initialise parameters (duty cycle, channel, GPIO): | + | MG 90 servos that we use in our lab are specific. As mentioned above, to achieve a full 180-degree rotation range, their minimum and maximum duty cycle timings go far beyond standards. We will create a function for calculating the duty cycle for the servo with the angle as the input parameter. |
<code c> | <code c> | ||
- | srv.attach(SRV_PIN, PWMSRV_Ch,srv_min_us, srv_max_us); | + | void fSrvSet(int pAngle) |
+ | { | ||
+ | if (pAngle< | ||
+ | if (pAngle> | ||
+ | int i_srv=500+(200*pAngle)/ | ||
+ | MyTimServo-> | ||
+ | }; | ||
</ | </ | ||
- | 50Hz frequency is standard, so we do not need to configure it. | ||
- | |||
=== Step 4 === | === Step 4 === | ||
- | Rotating a servo is as easy as writing | + | Rotating a servo is as easy as calling our function with the desired angle as the parameter, e.g.: |
<code c> | <code c> | ||
- | srv.write(SRV_PIN,180); | + | fSrvSet(90); |
delay(2000); | delay(2000); | ||
</ | </ |