stm32f103c8t6的TIM3ch2驱动sg90舵机代码
时间: 2023-09-23 21:12:04 浏览: 102
以下是一个基本的STM32F103C8T6的TIM3ch2驱动SG90舵机的代码:
```c
#include "stm32f10x.h"
void TIM3_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 开启TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // TIM3_CH2(PB5)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB
TIM_TimeBaseStructure.TIM_Period = 20000 - 1; // PWM频率为50Hz
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // APB1时钟频率为72MHz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频因子
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OCInitStructure.TIM_Pulse = 1500; // 初始占空比50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性为高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE); // 使能TIM3
TIM_CtrlPWMOutputs(TIM3, ENABLE); // 使能TIM3的PWM输出
}
void DelayMs(uint32_t milliseconds)
{
uint32_t i;
for(i = 0; i < milliseconds; i++)
{
uint32_t j;
for(j = 0; j < 10727; j++); // 大概延时1ms
}
}
int main(void)
{
TIM3_Configuration();
while(1)
{
TIM_SetCompare2(TIM3, 1000); // 占空比为5%
DelayMs(1000);
TIM_SetCompare2(TIM3, 1500); // 占空比为7.5%
DelayMs(1000);
TIM_SetCompare2(TIM3, 2000); // 占空比为10%
DelayMs(1000);
}
}
```
在上面的代码中,我们使用了STM32F103C8T6板子上的TIM3_CH2(PB5)来驱动SG90舵机。我们在TIM3的PWM输出通道2上配置了一个50Hz的PWM信号,并且使用了一个20000的计数器周期和一个72的预分频器来实现这个频率。然后,我们在TIM_OCInitStructure中设置了一个初始的占空比50%(1500),并且使能了输出和高电平输出极性。最后,我们在主循环中改变了占空比来控制舵机的位置。
阅读全文