专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
新手求一段在MDK5环境下通过输出PWM驱动舵机的程序。。。
2019-07-24 13:09
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
17268
4
1183
新手求一段在MDK5环境下通过输出PWM驱动舵机的程序。。。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
Mascreda
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]
加载中...
查看其它4个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
/******************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]
一周热门 更多>