STM32与PC串口通信 实现步进电机转速可调 程序及调试过程分享
在读书期间,需要用到步进电机。用STM32F103ZET6作为下位机,采用计时器产生PWM波,通过改变改变ARR的值,改变PWM波的频率,实现步进电机调速,LCD屏幕显示串口收到的数值。
PC作为上位机,利用串口向STM32发出0-5的数字,根据收到的数值改变步进电机转速。
需要注意两点:
(1) PC上面的串口调试助手在默认情况下,发出的是ASCⅠⅠ码,在接收时需要做数据处理,运算输出数字;
(2)改变计数器产生PWM的频率与改变占空比不用,改变占空比的时候,可以在PWM连续产生的过程中改变,而改变PWM波的频率,需要先DISABLE,更新ARR,再ENABLE(该方法是目前试的一种可用的,应该还会有其他方法。。。)。
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "lcd.h"
#include "math.h"int main(void){ //extern u32 tally; //用法 extern + 类型 + 变量名//u16 Angle_num;//u32 Num; u8 t;u8 n; u8 len;//u16 speed_val;u16 val; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //LED端口初始化OUTPUT_Init();//TIM2_PWM_Init(100,72); //Angle_num=360; //表示要转的角度 10个脉冲电机转1°//Num=Angle_num*10; //3600 Pulse/rev Angle_num表示要转多少度(10个脉冲转一度)LCD_Init(); //LCD端口初始化POINT_COLOR=RED; //设置字体为红色 LCD_ShowString(60,50,200,16,16,"Elite STM32"); LCD_ShowString(60,70,200,16,16,"USART"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(60,110,200,16,16,"2021/2/5"); //显示提示信息POINT_COLOR=BLUE;//设置字体为蓝色LCD_ShowString(60,130,200,16,16,"USART_VAL:");while(1){if(USART_RX_STA&0x8000) //判断USART_RX_STA的最高位是否为1{ val=0;len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度for(t=0;t<len;t++){n=len-t-1;val=val+(USART_RX_BUF[t]-48)*pow(10, n); //串口传输过来的是ASC码,需要进行数字处理}LCD_ShowxNum(160,130,val,4,16,0); //显示串口输入的 数值 USART_RX_STA=0; //将接收状态标志去除if(val==0) TIM_Cmd(TIM2, DISABLE); else{if(val==1) {TIM_Cmd(TIM2, DISABLE); //要先失能TIM2_PWM_Init(250,72); //更新arr值TIM_Cmd(TIM2, ENABLE); //再使能}if(val==2) { TIM_Cmd(TIM2, DISABLE);TIM2_PWM_Init(200,72);//TIM2_PWM_Init(speed_val,72); //不分频。计数频率=72000000/72=1000Khz,脉冲时间为0.1ms. (arr,psc) 输入需要的值即可,arr需要为偶数TIM_Cmd(TIM2, ENABLE);}if(val==3) {TIM_Cmd(TIM2, DISABLE);TIM2_PWM_Init(150,72);TIM_Cmd(TIM2, ENABLE); } if(val==4) {TIM_Cmd(TIM2, DISABLE);TIM2_PWM_Init(100,72);TIM_Cmd(TIM2, ENABLE); }if(val==5) {TIM_Cmd(TIM2, DISABLE);TIM2_PWM_Init(50,72);TIM_Cmd(TIM2, ENABLE); }}}}
timer.c
#include "timer.h"
#include "led.h"
#include "usart.h"
u32 tally;
void TIM2_PWM_Init(u16 arr,u16 psc)
{ GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 //设置该引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形 GPIOA.1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO//初始化TIM2TIM_TimeBaseStructure.TIM_Period = arr-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc-1; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//初始化TIM2 Channel 2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = arr/2-1; //给出ccr值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器/*TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器*/
}/*void TIM2_IRQHandler(void) //TIM3中断
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 {TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 tally=tally+1;}
}*/void OUTPUT_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PE端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; //PE.11 PE.12 端口配置, 推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHzGPIO_ResetBits(GPIOE,GPIO_Pin_11); //PE.11 输出低 接使能端GPIO_SetBits(GPIOE,GPIO_Pin_12); //PE.12 输出低 接转向控制端}
timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM2_PWM_Init(u16 arr,u16 psc);
void OUTPUT_Init(void);
#endif
采用XCOM V2.2串口调试助手向STM32串口发送数据
经过测试可以正常使用。
STM32与PC串口通信 实现步进电机转速可调 程序及调试过程分享相关推荐
- 基于FPGA的红外遥控解码与PC串口通信
基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...
- fpga板子怎么和电脑连_FPGA与PC串口通信设计与实现
FPGA 与 PC 串口通信设计与实现 朱泽锋 1 赵丹辉 2 王鹏宇 1 [摘 要] 本文采用 Verilog 硬件描述语言,利用 Xilinx 公司的 FPGA 芯片实现 其与 PC 间的串行通信 ...
- STM32和ROS串口通信常见问题汇总答疑
STM32和ROS串口通信常见问题汇总答疑 大家好,我是白茶清欢,最近看了博客文章<stm32和ros的串口通信>有很多问题的评论,这里汇总回复一下. 问题1:运行时报错如下: rosru ...
- Ardunio 完成STM32板子的串口通信
目录 一.Ardunio简介 二.Ardunio配置 三.实验 四.其它 实验目的: 安装 Ardunio IDE 和相关软件支持库,在Ardunio 上完成STM32板子的串口通信程序:持续向串口输 ...
- 串口和计算机通信,一. PC与PC串口通信
设计任务: 采用LabVIEW编写程序实现PC与PC串口通信.要求:两台计算机互发字符并自动接收,如PC1输入字符串"收到信息请回字符abc123",执行"发送字符&qu ...
- STM32的USART串口通信小程序
文章目录 前言 一.串口协议和RS-232.485标准 1.串口通信协议的概念 2.常用协议 2.1 RS-232 2.2 RS-485 3.RS232.485电平与TTL电平的区别 二.STM32的 ...
- 【STM32】STM32和PC串口的NRF24L01通信测试
使用NRF24L01实现STM32之间.PC之间以及STM32和PC之间的通信 前言 硬件实现 软件实现 测试结果 结论 1. 前言 小弟最近看了一些中近距离(200m以内)的无线通信方法,像Zigb ...
- STM32中关于串口通信的printf()函数重定向问题
在STM32串口通信程序中使用printf()函数发送数据非常方便,但是需要先进行简单的配置,下面介绍两种配置方法. 方法一.对工程属性进行配置 第1步:在main.c中包含"stdio.h ...
- STM32中的串口通信的基础知识
目录 串口通信基本原理 并行通信与串行通信 串行通信中单工,半双工和全双工的区别 按通信方式不同又可分为异步通信和同步通信 常见的串行通信接口 STM32中的5个串口引脚 STM32中USART的通信 ...
最新文章
- python游戏服务器框架_mqant首页、文档和下载 - Golang/python语言开发的分布式游戏服务器框架 - OSCHINA - 中文开源技术交流社区...
- Java Swing 之Timer配合JProgressBar的使用
- python 字符串填充0
- 坡道行驶电动小车_事发红绿灯路口!东莞一女子骑电动滑板车被撞致颅内出血…...
- python图像边缘提取_python通过robert、sobel、Laplace算子实现图像边缘提取详解
- Windows10多桌面的理解和作用
- 二分查找和折半插入排序一块说说-很合适~~~
- 存储过程 while is null_4.2 串的存储实现(2)
- Docker 命令详解(run篇)
- Prince2与PMP的区别
- ActiveMq笔记3-AMQ高可用性理论
- java反向链表列表写法,一个使用链表追加,反向和显示的java程序
- 判断当前是什么版本浏览器
- NPM酷库:chalk,多彩的粉笔
- 零基础实现摄像头的全平台直播 (一)内网直播的实现
- python版钉钉回调
- Oracle分区表管理
- Sentinel 相关知识点整理
- 《Unity 3D脚本编程:使用C#语言开发跨平台游戏》序言
- ASPICE-汽车软件过程改进及能力评定
热门文章
- FME转换DWG到KML或KMZ
- 数据科学包_Fourth_Chapter
- 信息学奥赛一本通高手训练1679:子集
- PCA降维算法(内含PCA可视化迷你案例+PCA人脸识别降维案例+PCA逆转降噪案例)
- Python爬虫BS4库的解析器正确使用方法
- C# 编写Windows Service(windows服务程序)(第二种)
- java skeleton_stub 和 skeleton 的讲解,自己实现一个stub和skeleton程序
- S7COMM协议分析
- sql 汉字按照首字母排序
- 牛客:毕业生的纪念礼物(优先队列 || STL嵌套)