文章目录
前言
💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
资料获取
文章底部名片,详细资料联系我。
设计介绍
由于整个程序比较复杂,且计算量较大,用到了较多的浮点数计算,所以程序的编写采用了C语言。
对于大多数单片机,使用C语言这样的高级语言与使用汇编语言相比具有如下优点:
(1)不需要了解处理器的指令集,也不必了解存储器结构。
(2)寄存器分配和寻址方式由编译器进行管理,编程时不需要考虑存储器的(3)地址和数据类型等细节。
(4)指定操作的变量选择组合提高了程序的可读性。
(5)可使用与人的思维更相近的关键字和操作函数。
(6)与使用汇编语言相比,程序的开发和调试时间大大缩短。
(7)C语言的库文件提供了许多标准的例程。
(8)通过C语言可实现模块化编程技术,从而可将已编制好的程序加到 新程序中。
(9)C语言可移植性好且非常普及,C语言编译器几乎适用于所有的目标系统,己完成的项目可以很容易的转换到其它的处理器或环境中与汇编语言相比,C语言在功能上、结构性、可读性、可移植性、可维护性上有明显的优势,易学易用。
功能介绍
STM32单片机无刷直流电机调速蓝牙APP控制118
本系统由STM32F103C8T6单片机核心板、按键电路、蓝牙模块、
电调模块及电机部分组成。
通过按键可以驱动无刷直流电机停止、加速、减速;中间按键为加速按键,
上电后按下加速按键即可运行。运行中按下停止键直接停止。
通过蓝牙可以就控制直流无刷电机的运行情况,在APP界面首先"使能控制",
可以对电机加速、减速控制,也可以拖动滚条直接控制;也可以停止电机运行。
3、电机转速是缓慢变化的,是为了防止转速变化过快导致电机剧烈抖动可能带来的危险和电机自身的损伤。
注意:在APP界面只有"使能控制"后才可以控制电机运行状况,防止误操作。
设计程序
#include "math.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include "pwm.h"
#include "serial_msg.h"
#define speed_perset 80
char dis_temp[18]; //显示暂存数组
u16 PPM_now=720;
u16 PPM_set=720;
//减速
void Speed_Dec(u8 ppm){
PPM_set -= ppm;
if(PPM_set<830){//电机内部有阻力,转速小于一定值是转不起来的
PPM_set = 720;//小于830则直接等于720(停止)
}
else if(PPM_set>1440){//1440为全速运行
PPM_set=1440;
}
}
//加速
void Speed_Inc(u8 ppm){
PPM_set += ppm;
if(PPM_set<830){//电机内部有阻力,转速小于一定值是转不起来的
PPM_set=830;//小于830则直接等于830(启动)
}
else if(PPM_set>1440){//1440为全速运行
PPM_set=1440;
}
}
/**********************************
串口通信的数据格式使用自定义的协议
具体协议内容请参考serial_msg.h
**********************************/
unsigned char i;
int main(void)
{
u8 index_msg_process=0;
NVIC_Configuration();
delay_init(); //延时函数初始化
USARTx_Init(USART1,9600); //串口初始化为9600
// USARTx_Init(USART2,9600); //串口初始化为9600
TIM3_Int_Init(99,7199);//10ms
TIM2_PWM_Init(14399,100);//100分频。PWM频率=72000000/(14399+1)/100=50Hz
TIM_SetCompare1(TIM2,PPM_now);
KEY_Init();
while(1)
{
process_msg_uart();//处理串口接收到的数据
if(serialMsg[index_msg_process].enable == TRUE){ //如果接收到了一个完整的数据
serialMsg_send.length = 0;
switch(serialMsg[index_msg_process].cmd){//根据不同的数据指令进行不同的处理
case CMD_APP_SET_SPEED: //设置转速
PPM_set = serialMsg[index_msg_process].payload[0]*256+serialMsg[index_msg_process].payload[1];
if(PPM_set>1440){
PPM_set = PPM_now;
}
else if(PPM_set<830){//电机内部有阻力,转速小于一定值是转不起来的
PPM_set = 720;//小于830则直接等于720(停止)
}
break;
case CMD_APP_SPEED_DEC: //减速
Speed_Dec(10);
break;
case CMD_APP_SPEED_INC: //加速
Speed_Inc(10);
break;
case CMD_APP_SET_STOP: //停止
PPM_set = 720;
break;
default:break;
}
//回复信息
serialMsg_send.cmd = CMD_RESPONSE | serialMsg[index_msg_process].cmd;
serialMsg_send.checkSum = CalculateCheckSum(serialMsg_send);
SendMsgObj(USART1,serialMsg_send);
//指向下一条信息
serialMsg[index_msg_process].enable = FALSE;
index_msg_process++;//**All notes can be deleted and modified**//
}
KeyScan();
if(KeyIsPress(key_dec)){//减速
Speed_Dec(10);
}
if(KeyIsPress(key_inc)){//加速
Speed_Inc(10);
}
if(KeyIsPress(key_stop)){//停止
PPM_set = 720;
}
}
}
具体实现截图
设计获取
文章下方名片联系我即可~
精彩专栏推荐订阅:在下方专栏👇🏻
收藏关注不迷路!!
🌟文末获取设计🌟