在读书期间,需要用到步进电机。用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串口通信 实现步进电机转速可调 程序及调试过程分享相关推荐

  1. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  2. fpga板子怎么和电脑连_FPGA与PC串口通信设计与实现

    FPGA 与 PC 串口通信设计与实现 朱泽锋 1 赵丹辉 2 王鹏宇 1 [摘 要] 本文采用 Verilog 硬件描述语言,利用 Xilinx 公司的 FPGA 芯片实现 其与 PC 间的串行通信 ...

  3. STM32和ROS串口通信常见问题汇总答疑

    STM32和ROS串口通信常见问题汇总答疑 大家好,我是白茶清欢,最近看了博客文章<stm32和ros的串口通信>有很多问题的评论,这里汇总回复一下. 问题1:运行时报错如下: rosru ...

  4. Ardunio 完成STM32板子的串口通信

    目录 一.Ardunio简介 二.Ardunio配置 三.实验 四.其它 实验目的: 安装 Ardunio IDE 和相关软件支持库,在Ardunio 上完成STM32板子的串口通信程序:持续向串口输 ...

  5. 串口和计算机通信,一. PC与PC串口通信

    设计任务: 采用LabVIEW编写程序实现PC与PC串口通信.要求:两台计算机互发字符并自动接收,如PC1输入字符串"收到信息请回字符abc123",执行"发送字符&qu ...

  6. STM32的USART串口通信小程序

    文章目录 前言 一.串口协议和RS-232.485标准 1.串口通信协议的概念 2.常用协议 2.1 RS-232 2.2 RS-485 3.RS232.485电平与TTL电平的区别 二.STM32的 ...

  7. 【STM32】STM32和PC串口的NRF24L01通信测试

    使用NRF24L01实现STM32之间.PC之间以及STM32和PC之间的通信 前言 硬件实现 软件实现 测试结果 结论 1. 前言 小弟最近看了一些中近距离(200m以内)的无线通信方法,像Zigb ...

  8. STM32中关于串口通信的printf()函数重定向问题

    在STM32串口通信程序中使用printf()函数发送数据非常方便,但是需要先进行简单的配置,下面介绍两种配置方法. 方法一.对工程属性进行配置 第1步:在main.c中包含"stdio.h ...

  9. STM32中的串口通信的基础知识

    目录 串口通信基本原理 并行通信与串行通信 串行通信中单工,半双工和全双工的区别 按通信方式不同又可分为异步通信和同步通信 常见的串行通信接口 STM32中的5个串口引脚 STM32中USART的通信 ...

最新文章

  1. python游戏服务器框架_mqant首页、文档和下载 - Golang/python语言开发的分布式游戏服务器框架 - OSCHINA - 中文开源技术交流社区...
  2. Java Swing 之Timer配合JProgressBar的使用
  3. python 字符串填充0
  4. 坡道行驶电动小车_事发红绿灯路口!东莞一女子骑电动滑板车被撞致颅内出血…...
  5. python图像边缘提取_python通过robert、sobel、Laplace算子实现图像边缘提取详解
  6. Windows10多桌面的理解和作用
  7. 二分查找和折半插入排序一块说说-很合适~~~
  8. 存储过程 while is null_4.2 串的存储实现(2)
  9. Docker 命令详解(run篇)
  10. Prince2与PMP的区别
  11. ActiveMq笔记3-AMQ高可用性理论
  12. java反向链表列表写法,一个使用链表追加,反向和显示的java程序
  13. 判断当前是什么版本浏览器
  14. NPM酷库:chalk,多彩的粉笔
  15. 零基础实现摄像头的全平台直播 (一)内网直播的实现
  16. python版钉钉回调
  17. Oracle分区表管理
  18. Sentinel 相关知识点整理
  19. 《Unity 3D脚本编程:使用C#语言开发跨平台游戏》序言
  20. ASPICE-汽车软件过程改进及能力评定

热门文章

  1. FME转换DWG到KML或KMZ
  2. 数据科学包_Fourth_Chapter
  3. 信息学奥赛一本通高手训练1679:子集
  4. PCA降维算法(内含PCA可视化迷你案例+PCA人脸识别降维案例+PCA逆转降噪案例)
  5. Python爬虫BS4库的解析器正确使用方法
  6. C# 编写Windows Service(windows服务程序)(第二种)
  7. java skeleton_stub 和 skeleton 的讲解,自己实现一个stub和skeleton程序
  8. S7COMM协议分析
  9. sql 汉字按照首字母排序
  10. 牛客:毕业生的纪念礼物(优先队列 || STL嵌套)