OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4300|回复: 5

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

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-4-11
在线时间
2 小时
发表于 2018-4-11 16:15:01 | 显示全部楼层 |阅读模式
5金钱
新手求一段在MDK5环境下通过输出PWM驱动舵机的程序。。。

最佳答案

查看完整内容[请看2#楼]

[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 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

94

帖子

0

精华

高级会员

Rank: 4

积分
934
金钱
934
注册时间
2017-4-8
在线时间
111 小时
发表于 2018-4-11 16:15:02 | 显示全部楼层
[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("\r\n test \r\n");
        while (1)
        {
               
//                printf("\r\n 开始\r\n");
                if(Key1_Scan())//按键按下 有手环落下
                {       
                        start= 1;        //开始检测
                }
       
                if(start == 1)        //未超时 未检测到ID一直震动 旋转
                {
//                        printf("\r\n key \r\n");
                //        TIM_Cmd(TIM2, ENABLE);        //TIM2开始计时 开始震动(PB2)1s 1次 --- 改成一直震动
//                        printf("\r\n  Rotate\r\n");
                        GPIO_ResetBits(GPIOB,GPIO_Pin_1);        //输出低 开启电机旋转
                        GPIO_ResetBits(GPIOA,GPIO_Pin_7);        //输出低 开启电机旋转

                       
                        if(Get_ID)//检测到ID
                        {
                                //start = 0;
                                Get_ID = 0;
//                                printf ("\r\n  Get_ID = 0 \r\n");       
                               
                        //  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("\r\n Servo+++\r\n");
                                TIM_SetCompare3(TIM3,60); //舵机翻转 数值待测

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

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

                        }               
       
                }
        }       
}
  




       






















[/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-12 00:35:51 | 显示全部楼层
就是个pwm输出啊,自己看资料,根据我们例程,很快可以搞定。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
发表于 2018-4-12 09:11:06 | 显示全部楼层
本帖最后由 我是路人甲 于 2018-4-12 09:12 编辑

PWM的占空比
回复

使用道具 举报

5

主题

94

帖子

0

精华

高级会员

Rank: 4

积分
934
金钱
934
注册时间
2017-4-8
在线时间
111 小时
发表于 2018-4-12 10:04:54 | 显示全部楼层
配置好定时器后  main.c中调用TIM_SetCompare3(TIM3,148); 就可以 实现舵机转动
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2020-1-25
在线时间
4 小时
发表于 2020-3-13 11:53:24 | 显示全部楼层
很有用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 10:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表