在Tout(定时器溢出时间)=20 ms arr=200 psc=7200 条件下 每计一个数的时间为0.1ms
则在此条件下 0—180 ° 计数5—25 存在线性关系
CCRx = (1.0/9.0)* angle + 5.0;
通过在sg90.c文件中 写sg90_angle_set(uint16_t angle)的函数来实现角度与ccr值的转换
下面为sg90.c文件代码
#include "sg90.h"
TIM_HandleTypeDef tim3_handle={0};
//初始化函数init函数
void tim3_init(void)
{
TIM_OC_InitTypeDef pwm_config = {0};
tim3_handle.Instance = TIM3;
tim3_handle.Init.Period = 200 -1;
tim3_handle.Init.Prescaler= 7200-1;
tim3_handle.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数
HAL_TIM_PWM_Init(&tim3_handle); //时基工作参数配置
pwm_config.OCMode = TIM_OCMODE_PWM1 ; //设置PWM的的模式 有两种模式 模式1和模式2
pwm_config.OCPolarity = TIM_OCPOLARITY_HIGH; //在模式选定完成后,选择有效电平为高电平 还是低电平
pwm_config.Pulse =100; //设置CCR的初值 一般情况下随便设置
HAL_TIM_PWM_ConfigChannel(&tim3_handle,&pwm_config,TIM_CHANNEL_1); //第三个参数是选择渠道
HAL_TIM_PWM_Start(&tim3_handle,TIM_CHANNEL_1 );
}
//msp初始化函数
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3)
{
//①定义初始化结构体
GPIO_InitTypeDef gpio_initstruct;
//打开时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //打开GPIO的时钟
__HAL_RCC_TIM3_CLK_ENABLE(); //打开定时器的时钟
//调用GPIO初始化函数
gpio_initstruct.Pin = GPIO_PIN_6 ; //LED1、LED2对应的引脚
gpio_initstruct.Pull = GPIO_PULLUP; //上拉
gpio_initstruct.Mode =GPIO_MODE_AF_PP; //推挽复用输出
gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
}
}
//修改CCR寄存器值
void tim3_compare_set(uint16_t val)
{
__HAL_TIM_SET_COMPARE(&tim3_handle,TIM_CHANNEL_1,val);
}
void sg90_init(void)
{
tim3_init();
}
void sg90_angle_set(uint16_t angle)
{
uint16_t CCRx = (1.0/9.0)* angle + 5.0; //根据线性关系进行角度和ccr值的转换 角度0—180 ccr为 5—25 可得该公式 并进行强转 浮点数转化为整数
tim3_compare_set(CCRx);
}
主函数为
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "sg90.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init();
sg90_init(); // 确保Tout为 20ms
//uint16_t i =0;
while(1)
{
sg90_angle_set(0);
delay_ms(1000);
sg90_angle_set(20);
delay_ms(1000);
sg90_angle_set(40);
delay_ms(1000);
sg90_angle_set(90);
delay_ms(1000);
sg90_angle_set(180);
delay_ms(1000);
// for(i=5;i<=25; i++)
// {
// tim3_compare_set(i);
// delay_ms(100);
// }
// for(i=5;i<=25; i++)
// {
// tim3_compare_set(30-i);
// delay_ms(100);
// }
}
}