STM32接收串口数据-输出PWM

发布者:collectors最新更新时间:2019-04-09 来源: eefocus关键字:STM32  串口数据  PWM 手机看文章 扫描二维码
随时随地手机看文章

#include

#include "sys.h"

#include "usart.h"

#include "delay.h"

#include "led.h" 

#include "key.h"

#include "exti.h"

#include "wdg.h"

#include "timer.h"

#include "string.h"  

//Mini STM32开发板范例代码8

//PWM输出 实验

//正点原子@ALIENTEK

//技术论坛:www.openedv.com   

//#define led_PB12   PBout(12)    //位绑定,位定义PB12口作为LED输出。这样速度最快    这个是开始测试用的输出口

 

//切记一定,要在这里修改一下

//TIM3->CCMR1|=6<<12;  //CH2 PWM2模式 与上面极性相反 平时用小灯来测试

 

 

#define deltaAngle 24//8*3 1080/320=3.375   1080/240=4.5

//下面两句为测试使用

//#define deltaErrorX 3//每转动delta角度,坐标X的改变量

//#define deltaErrorY 4//每转动delta角度,坐标Y的改变量

 

#define maxAngle 1520   //1520   //对应135+22.5=157.5  360--0度 720--45度  1080--90度  1440--135度 1800--180度

#define minAngle 540 //540   //对应0+22.5=22.5  因为图像是640*480的 最多产生640的差距

 

//#define maxAngle 1420   //1520   //对应135+22.5=157.5  360--0度 720--45度  1080--90度  1440--135度 1800--180度

//#define minAngle 640 //540   //对应0+22.5=22.5  因为图像是640*480的 最多产生640的差距

#define margine 30 //横向上最右边,范围也就是47

void tim3PWM(int changeAngle)//俯仰舵机

{

//PWM_Init(14400,100)定义了14400 对应20毫秒,720对应1毫秒,360对应0.5毫秒,电机的控制是0.5-2.5毫秒之间,1.5代表中位

TIM3->CCR2 = changeAngle; //现在TIM3的2通道 TIM4的1通道 都可以用了 只需要改变这句 以及main函数中的//TIM4->CCR1 = 1080;即可

//TIM4->CCR1 = changeAngle;

//delay_ms(20);

}

 

void tim4PWM(int changeAngle)

{

//TIM4->CCR1 = changeAngle;    不知道为什么总是出现1.5到2ms 再从2到1.5毫秒 跳变 貌似时钟不一样 改为tim4的2通道

TIM4->CCR2 = changeAngle; //这个2通道 PB7口

//delay_ms(20); //根究DS0灯的PWM显示,貌似这里是不需要等待20毫秒的

}

 

 

//char imgCenterX[5];  这里的4个变量,修改为在usart.h中声明,在usart.c文件中定义,在本文件中使用,切勿重复定义

//char imgCenterY[5];

//int imgCenterX0,imgCenterX1;

//int imgCenterY0,imgCenterY1;

 

//char testChar[]={"300 "};   测试需要 正式程序不需要

 

int errorX=100,errorY=100;

 

int changeAngleX;

int changeAngleY;

 

int errorX0,errorY0;

int sumErrorX,sumErrorY;

int diffErrorX,diffErrorY;

float pidValueX,pidValueY;

float Kp=0.15,Ki=0,Kd=0;

int main(void)

{

/************************接收串口数据后,再发回,显示************************************************************/

u8 t;

u8 len;

u16 times=0; 

/************************************************************************************/

 

/************************************************************************************/

  u16 led0pwmval=0;

u16 led1pwmval=0;

u8 dir=1;

/************************************************************************************/

 

  Stm32_Clock_Init(9); //系统时钟设置

delay_init(72);      //延时初始化

uart_init(72,9600);  //串口初始化 串口1  串口2-5的时间晶振是不一样的 小一半 

LED_Init();   //初始化与LED连接的硬件接口

 

    //PWM_Init(900,100);   //测试DS0小灯时,用这个频率

PWM_Init(14400,99); //PWM频率是50hz  20ms对应的是14400 1ms对应720 TIM3_CH2->PA7 TIM4_CH2->PB7

 

/************每次运行程序都进行中位初始化*************************/

TIM3->CCR2 = 1080; //1.5毫秒 中位 90度

//TIM4->CCR1 = 1080; //1.5毫秒 中位 90度

TIM4->CCR2 = 1080;

delay_ms(2000); 


changeAngleX=1080;   //因为上面3句,先设定为中间位置了,所以调整也从中间开始,左右旋转deltAngle

changeAngleY=1080;

 

    while(1)

{

  if(USART_RX_STA&0x80)    //接收完

{    

len=USART_RX_STA&0x3f;//得到此次接收到的数据长度

/******************下面这几句发送串口的 不知道为什么会影响PWM波的输出***********************/

// printf("n您发送的消息为:n");

// for(t=0;t

// {

// USART1->DR=USART_RX_BUF[t]; //当向寄存器USART1->DR写数据是,会进行自动的串口发送 王博20150620

// while((USART1->SR&0X40)==0);//等待发送结束

// }

//

//// test[0]=USART_RX_BUF[0];

//// test[1]=USART_RX_BUF[1];

//// test[2]=USART_RX_BUF[2];

//// test[3]=USART_RX_BUF[3];

////

//// testInt = atoi(test);

//// printf("%d",testInt);

//

// printf("nn");//插入换行

USART_RX_STA=0;

delay_ms(20);

}else

{

// times++;

// /*

// if(times%5000==0)

// {

// printf("nMiniSTM32开发板 串口实验n");

// printf("正点原子@ALIENTEKnnn");

// }

// */

// if(times%200==0)printf("请输入数据,以回车键结束n");

// delay_ms(20);    

}

/************************************************************************************/

/************************************************************************************/

//1440对应180度的话,1440/180=8 每转1度,应该在误差上+8

/*********************************主要的最终的程序 先屏蔽****************************************************/

/*************************************************************************************************/



errorX=imgCenterX1-imgCenterX0;

errorY=imgCenterY1-imgCenterY0;


sumErrorX+=errorX;

sumErrorY+=errorY;

 

diffErrorX=errorX-errorX0;

diffErrorY=errorY-errorY0;

 

errorX0=errorX;

errorY0=errorY;


pidValueX=Kp*errorX+Ki*sumErrorX+Kd*diffErrorX;

pidValueY=Kp*errorY+Ki*sumErrorY+Kd*diffErrorY;

 

printf("pidValueX:%fn",pidValueX);

//printf("pidValueY:%fn",pidValueY);

//

// printf("errorX:%dn",errorX);

// printf("errorY:%dn",errorY);

    if( (errorX>margine) || (errorX<-margine) )

{

changeAngleX=changeAngleX-pidValueX;

 

if(changeAngleX

changeAngleX=minAngle;

if(changeAngleX>maxAngle)

changeAngleX=maxAngle;

tim3PWM(changeAngleX);

}

else //if( ( errorX

{

tim3PWM(changeAngleX);

}

 

 

if( (errorY>margine) || (errorY<-margine) )

{

changeAngleY=changeAngleY-pidValueY;

 

if(changeAngleY

changeAngleY=minAngle;

if(changeAngleY>maxAngle)

changeAngleY=maxAngle;

tim4PWM(changeAngleY);

}

else if( ( errorY

{

tim4PWM(changeAngleY);

}

 

// else

// {

// tim3PWM(1080);

// tim4PWM(1080);

// delay_ms(40);

// }

/*************************************************************************************************/

/*************************************************************************************************/

//TIM3->CCR2 = 360; //按理说,这个应该是归0的,但是舵机一般难以达到0度,所以从540开始

//TIM4->CCR2 = 360;

 

//TIM3->CCR2 = 540; 

//TIM4->CCR2 = 540;

 

//TIM3->CCR2 = 720; //45度位置

//TIM4->CCR2 = 720;

 

//TIM3->CCR2 = 1080; //1.5毫秒 中位 90度

//TIM4->CCR2 = 1080;


//TIM3->CCR2 = 1440; //135度

//TIM4->CCR2 = 1440;

 

//TIM3->CCR2 = 1620; 

//TIM4->CCR2 = 1620;

 

//TIM3->CCR2 = 1800; //按理说,这个应该是180度的,但是舵机一般难以达到180度,所以从1620截止

//TIM4->CCR2 = 1800;

/*************************************************************************************************/

/*************************************************************************************************/

/*******************************以上程序可PA7可以正常输出PWM波,但是必须将TIM3->CCMR1|=7<<12;极性进行设置***************************/

/*******************************由于上面的程序中用到了errorX变量,所以如果一起运行的话,会受到影响***************************/

//   if(dir)

// {

// errorX++;

// }

//    

// else 

// {

// errorX--;

// }

//

// if(errorX>maxAngle)

// dir=0;

// if(errorY==0)

// dir=1;

//

// tim3PWM(errorX);

//

// if(dir)

// {

// errorY++;

// }

//    

// else 

// {

// errorY--;

// }

//

// if(errorY>maxAngle)

// dir=0;

// if(errorY==0)

// dir=1;

//

// tim4PWM(errorY);

//

// delay_ms(5);  

 

/*******************************以上程序可PA7可以正常输出PWM波,但是必须将TIM3->CCMR1|=7<<12;极性进行设置*****************************/

}


 

}

关键字:STM32  串口数据  PWM 引用地址:STM32接收串口数据-输出PWM

上一篇:STM32八种输入输出模式详解
下一篇:STM32实战 2.矩阵键盘通过串口3输出

推荐阅读最新更新时间:2024-03-16 16:27

Contiki 在STM32 中的移植
使用野火的板子进行Contiki移植: 开发环境:IAR+STM32 代码移植基本上参照xukai871105 前辈的教程,不同之处是使用的是寄存器的操作方式,并没有是用STM32 的库函数。 代码如下: #include contiki.h #include stm32/usart/usart.h /* For usart_puts()*/ #include stdio.h /* For printf() */ #include sys/clock.h #include sys/process.h #include sys/procinit.h #include sys/etimer.h #inclu
[单片机]
2023 STM32全国巡展,米尔限量发STM32MP135开发板优惠券
2023年9月12日至10月27日,以“STM32,不止于芯”为主题的第十六届STM32全国巡回研讨会将走进11个城市,本届研讨会为全天会议,我们将围绕STM32最新产品开展技术演讲和方案演示。 本次STM32全国研讨会,米尔电子将现场展出STM32相关的最新产品技术和应用演示,为工程师们提供共话交流共同探索开放式平台,届时,米尔电子的技术工程师将与各位嘉宾面对面深入交流。感兴趣的客户和朋友欢迎莅临参观了解! 米尔电子的明星产品将精彩亮相 米尔MYC-YF13X 核心板及开发板 基于STM32MP1系列MPU,STM32MP135高性价比入门级MPU设计平台,完整的安全生态系统让MCU开发者友好地过渡到MPU平
[单片机]
2023 <font color='red'>STM32</font>全国巡展,米尔限量发STM32MP135开发板优惠券
奥地利微电子推出全新韵律灯LED驱动器
奥地利微电子公司(AMS)推出AS3665,支持手机和其它各种消费类应用呈现令人称奇的照明效果。AS3665将以最小的设计难度实现更锐利的色彩、更平滑的色彩效果和高亮度。这款全新的韵律灯LED驱动器可使手机、MP3播放器、笔记本电脑、便携式游戏机、音箱、玩具及任何音频设备表现得更为抢眼。 AS3665有9个LED通道,每个通道电流可高达25mA。每个通道都具有独立的12位脉宽调制(PWM)控制,能提供无与伦比的平滑色彩效果,实现线性、对数和比例变化效果。PWM发生器有3个排序器和一个1.5Kb的存储器。这使得在存储和处理惊人且复杂的光模式时无需外部处理器或交互干预。AS3665可针对各种光模式轻松实现基于指令的编程。工作
[电源管理]
STM32微控制器的可靠串口通信技术研究
引言 STM32F107微控制器是意法半导体推出的高性能32位以CortexM3为内核的面向工业控制的处理器。该处理器内部通过一个多层的AHB总线构架相连,其内部集成了丰富的外设,如USART、SPI、ADC等等。另外,STM32F107处理器还提供多达80个通用I/O接口,如此丰富的资源使STM32系列微控制器能够很理想地用于工业控制。本文设计出一种基于STM32F107的可靠串口通信设计方案,可以完成STM32F107处理器和PC机以及其他串口之间的可靠通信 。 1 串口通信的实现 1.1 硬件设计 STM32F107处理器的通用同步异步通信单元(USART)提供 5个独立的异步串行接口,并且都能工作在中断和DMA模式
[单片机]
<font color='red'>STM32</font>微控制器的可靠<font color='red'>串口</font>通信技术研究
STM32】HAL库-DAC
数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。 DAC框图 DAC引脚 为了避免寄生的干扰和额外的功耗,引脚PA4或者PA5在之前应当设置成模拟输入(AIN)。 使能DAC 将DAC_CR寄存器的ENx位置’1’即可打开对DAC通道x的供电。经过一段启动时间tWAKEUP,DAC通道x即被使能。 注意: ENx位只会使能DAC通道x的模拟部分,即便该位被置’0’,DAC通道x的数字部分仍然工作。 使能DAC输出缓存 DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓
[单片机]
【<font color='red'>STM32</font>】HAL库-DAC
STM32 | OpenBLT Bootloader的使用分享
OpenBLT 简介 OpenBLT是一种开源引导加载程序,可以在任何微控制器上运行并使用任何类型的通信接口来执行软件更新,而无需专用的调试器硬件。 官网介绍页: https://www.feaser.com/openblt/doku.php?id=homepage 源码下载页: https://sourceforge.net/projects/openblt/files/ 关于STM32的IAP、ISP、BootLoader相关的内容见往期笔记: 《STM32串口IAP分享》 《STM32的ISP下载的原理是什么呢?》 OpenBLT实践 下载源码,得到: 我们拿个ARMCM0_STM32G0_Nu
[单片机]
<font color='red'>STM32</font> | OpenBLT Bootloader的使用分享
STM32外部中断处理流程及注意事项
STM32的外部中断是以组为单位,例如PA0、PB0、PC0、PD0、PE0、PF0、PG0共用外部中断0,我们再使用时从中选择一个座位外部中断0即可,其他中断类推。 外部中断包括EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10,Pin0--Pin4有各自独立的中断, Pin5--Pin9共用一个中断,Pin10--Pin15共用一个中断。 中断号 Pin脚 EXTI0 Pin0 EXTI1 Pin1 EXTI2 Pin2 EXTI3 Pin3 EXTI4 Pin4 EXTI9_5 Pin5--Pin9 EXTI15_10 Pin10--Pin15 外部中
[单片机]
STM8S-定时器2的PWM
//软件环境:IAR FOR STM8 V1.0 //作者:Nicole //功能:定时器2的PWM功能,控制小灯的亮灭间隔 //日期:2010.11.10 #include iostm8s207k6.h void CLK_Init(void); void TIM_Init(void); // 函数功能:延时函数 // 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ void DelayMS(unsigned int ms) { unsigned char i; while(ms != 0) { for(i=0;i 250;i++) { } for(i=
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved