打印

stm32F767驱动舵机,不连贯

[复制链接]
230|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
冰糖炖雪梨|  楼主 | 2018-7-11 08:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用stm32F767驱动舵机。。功能从180到0度之后在从0到180度循环,180->0->180->0;
问题从180->0这个程序运行之前会有明显的延时,有没有大佬解决一下?

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
/************************************************
ALIENTEK 阿波罗STM32F7开发板 实验8
PWM输出实验-HAL库函数版
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/

int main(void)
{

    int    angle;
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();                        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
    delay_init(216);                //延时初始化
    uart_init(115200);                //串口初始化
    LED_Init();                     //初始化LED
    TIM3_PWM_Init(19999,107);     //108M/108=1M的计数频率,自动重装载为500,那么PWM频率为1M/500=2kHZ
    while(1)
    {
            


        for(angle=180;angle>=1;angle--)
        {
            SetJointAngle(angle);
            delay_ms(300);
        }
        for(angle=1;angle<=180;angle++)
        {
            SetJointAngle(angle);
            delay_ms(300);
            
        }


        }        
    }
   
#include "timer.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////     
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F7开发板
//定时器中断驱动代码      
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/11/27
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                      
//////////////////////////////////////////////////////////////////////////////////     
//修改说明
//V1.1 20160711
//新增TIM3_PWM_Init函数,用于PWM输出
//////////////////////////////////////////////////////////////////////////////////      

TIM_HandleTypeDef TIM3_Handler;         //定时器句柄
TIM_OC_InitTypeDef TIM3_CH4Handler;     //定时器3通道4句柄

//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
    TIM3_Handler.Instance=TIM3;            //定时器3
    TIM3_Handler.Init.Prescaler=psc;       //定时器分频
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM3_Handler.Init.Period=arr;          //自动重装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM3_Handler);       //初始化PWM
   
    TIM3_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM3_CH4Handler.Pulse=0;            //设置比较值,此值用来确定占空比,
                                            
    TIM3_CH4Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高
    HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);//配置TIM3通道4
    HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM通道4
}

//定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_TIM3_CLK_ENABLE();            //使能定时器3
    __HAL_RCC_GPIOB_CLK_ENABLE();            //开启GPIOB时钟
   
    GPIO_Initure.Pin=GPIO_PIN_1;               //PB1
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;      //复用推完输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    GPIO_Initure.Alternate=GPIO_AF2_TIM3;    //PB1复用为TIM3_CH4
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}

//设置TIM通道4的占空比
//compare:比较值
void TIM_SetTIM3Compare4(u32 compare)
{
    TIM3->CCR4=compare;
}


void    SetJointAngle(float    angle)
{
   

        
        angle=(u16)(20.0*angle+400.0);
        TIM_SetTIM3Compare4(angle);

   
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

430

主题

436

帖子

0

粉丝