stm32c8t6和舵机
时间: 2025-01-22 19:56:57 浏览: 51
### STM32C8T6 控制舵机的示例代码和教程
#### 1. 初始化定时器用于PWM输出
为了控制舵机,需要配置STM32C8T6的一个定时器来生成PWM信号。通常选择TIM2或TIM3这样的通用定时器。
```c
void TIM_PWM_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIO外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //设置PB6为复用推挽输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 999; //自动重装载值ARR=999
TIM_TimeBaseStructure.TIM_Prescaler = 71; //预分频系数PSC=71 (72M/(72+1)=1KHz)
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //不分割时钟周期
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数方式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较通道使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //上升沿有效
TIM_OCInitStructure.TIM_Pulse = 49; //占空比初始值CCR1=49(对应于中间位置)
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
}
```
此部分初始化了定时器并设置了PWM参数[^1]。
#### 2. 设置舵机角度函数
接下来定义一个可以调整PWM占空比从而改变舵机转动角度的功能函数:
```c
// 将角度转换成对应的PWM占空比数值
#define ANGLE_TO_DUTY(angle) ((angle * 2 / 18 + 2.5)*100-1)
void SetServoAngle(float angle){
uint16_t duty_cycle = ANGLE_TO_DUTY(angle);
if(duty_cycle >= 1 && duty_cycle <= 99){ //确保输入的角度范围合理
TIM_SetCompare1(TIM3,duty_cycle); //更新CCR寄存器中的值以更改PWM波形
}
}
```
这段代码实现了从期望的角度到实际PWM占空比之间的映射关系计算,并通过修改比较匹配值来达到调节目的[^4]。
#### 3. 主程序逻辑
最后,在`main()`函数里启动定时器以及调用上述设定好的接口完成对舵机的具体操作:
```c
int main(){
TIM_PWM_Init(); //初始化PWM功能
TIM_Cmd(TIM3,ENABLE); //开启定时器
while(1){
for(int i=0;i<=180;i+=10){ //循环遍历不同角度
SetServoAngle(i);
Delay_ms(500); //延时一段时间让舵机能跟上变化的速度
}
for(int j=180;j>=0;j-=10){
SetServoAngle(j);
Delay_ms(500);
}
}
}
void Delay_ms(uint32_t ms){
SysTick->LOAD = SystemCoreClock/1000*ms-1;
SysTick->VAL = 0x00;
SysTick->CTRL |=SysTick_CTRL_ENABLE_Msk ;
while((SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk)==0);
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk ;
}
```
以上就是完整的基于STM32C8T6单片机平台下利用PWM技术实现对于标准RS-510型180度旋转伺服电机的基本控制方法介绍。
阅读全文
相关推荐


















