新手求一段在MDK5环境下通过输出PWM驱动舵机的程序。。。

2019-07-24 13:09发布

新手求一段在MDK5环境下通过输出PWM驱动舵机的程序。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
Mascreda
1楼-- · 2019-07-24 15:54
[mw_shl_code=c,true]


/******************Timer3_CH3 *************************/


void TIM3_GPIO_Init(void)        //初始化TIM3_CH3 IO口
{
        GPIO_InitTypeDef GPIO_InitStructure;
          // 输出比较通道1 GPIO 初始化
/*
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
*/       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        //TIM3_CH3
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);       

}

void TIM3_Mode_Init()
{
        TIM_TimeBaseInitTypeDef        TIM_TimeBaseSturcture;       
        TIM_OCInitTypeDef  TIM_OCInitStructure;
               
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
       
        TIM_TimeBaseSturcture.TIM_ClockDivision = TIM_CKD_DIV1;        //不分频
        TIM_TimeBaseSturcture.TIM_CounterMode = TIM_CounterMode_Up;        //向上计数
        TIM_TimeBaseSturcture.TIM_Period = 1999;       
        TIM_TimeBaseSturcture.TIM_Prescaler = 720-1;       
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseSturcture);
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
               
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                // 配置为PWM模式1
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                // 输出使能       
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //当定时器计数值小于 CCR1_Val 时为高电平
        TIM_OCInitStructure.TIM_Pulse = 145;        //设置跳变值,当计数器计数到这个值时,电平发生跳变
       
       
//        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
//        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);       
//        TIM_OC2Init(TIM3, &TIM_OCInitStructure);
//        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
        TIM_OC3Init(TIM3, &TIM_OCInitStructure);
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
               
        TIM_ARRPreloadConfig(TIM3, ENABLE);                // 使能 TIM3 重载寄存器 ARR
       
        TIM_Cmd(TIM3,ENABLE);       

}


void TIM3_Init()
{
        TIM3_Mode_Init();
        TIM3_GPIO_Init();
}

/*****************  END OF FILE ****************************/

/**************** main.c ***************************/
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "timer.h"
#include "uart.h"
#include "delay.h"
#include "Motor.h"

/***************************

PB0             舵机PWM
PB1      旋转 低电平工作
PA7      震动 低电平工作
PB10     按键        现在PB12
PB11     Beep

****************************/
u16 CCR1=150;        //上电后占空比输出


extern uint8_t time_out;        //1s到标志位
extern uint8_t time_over;        //10s到标志位
extern uint8_t Get_ID;
uint8_t start = 0;        //按键按下一次,检测开始
extern uint8_t servo_out;

int main(void)
{       
       
        KEY_Init();
        Uart_Init();
        delay_init();

        TIM2_Init();        //用于定时
        TIM3_Init();        //用于舵机               

        Motor_Init();        //初始化电机
        Beep_Init();        //初始化蜂鸣器

        /* 舵机翻转用delay延时 */
//        printf(" test ");
        while (1)
        {
               
//                printf(" 开始 ");
                if(Key1_Scan())//按键按下 有手环落下
                {       
                        start= 1;        //开始检测
                }
       
                if(start == 1)        //未超时 未检测到ID一直震动 旋转
                {
//                        printf(" key ");
                //        TIM_Cmd(TIM2, ENABLE);        //TIM2开始计时 开始震动(PB2)1s 1次 --- 改成一直震动
//                        printf("   Rotate ");
                        GPIO_ResetBits(GPIOB,GPIO_Pin_1);        //输出低 开启电机旋转
                        GPIO_ResetBits(GPIOA,GPIO_Pin_7);        //输出低 开启电机旋转

                       
                        if(Get_ID)//检测到ID
                        {
                                //start = 0;
                                Get_ID = 0;
//                                printf ("   Get_ID = 0 ");       
                               
                        //  USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);        //关闭串口接收中断

                               
                                GPIO_SetBits(GPIOA,GPIO_Pin_7);        //输出高 停止震动
                                GPIO_SetBits(GPIOB,GPIO_Pin_1);        //输出高 停止电机旋转
                                TIM_Cmd(TIM2, DISABLE);        //关定时器2  

//                                printf(" Servo+++ ");
                                TIM_SetCompare3(TIM3,60); //舵机翻转 数值待测

                                delay_ms(1000);
//                                printf(" beep ");
//                                printf(" Servo-- ");
                                TIM_SetCompare3(TIM3,148); //舵机复位 数值待测
                                //开启串口接收中断

                                start = 0;        //一次检测结束
                        //  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);        //开启串口接收中断

                        }               
       
                }
        }       
}
  




       






















[/mw_shl_code]
正点原子
2楼-- · 2019-07-24 16:47
就是个pwm输出啊,自己看资料,根据我们例程,很快可以搞定。
我是路人甲
3楼-- · 2019-07-24 21:58
 精彩回答 2  元偷偷看……
Mascreda
4楼-- · 2019-07-25 01:26
配置好定时器后  main.c中调用TIM_SetCompare3(TIM3,148); 就可以 实现舵机转动

一周热门 更多>