历史上的今天
返回首页

历史上的今天

今天是:2025年04月09日(星期三)

正在发生

2019年04月09日 | STM32接收串口数据-输出PWM

2019-04-09 来源:eefocus

#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;极性进行设置*****************************/

}


 

}

推荐阅读

史海拾趣

远东福斯特公司的发展小趣事

对于光检测T型反馈电路,网友可能提出多方面的问题,以下是一些可能的问题及相应的回答:

一、电路结构与原理

问题1:光检测T型反馈电路的基本结构是怎样的?

回答:光检测T型反馈电路通常由光电探测器(如光电二极管、光电三极管等)、运算放大器、T型反馈网络及相关的电阻、电容等元件组成。光电探测器负责将光信号转换为电信号,运算放大器对电信号进行放大,而T型反馈网络则用于调整放大电路的增益和稳定性。

问题2:T型反馈电路相比传统反馈电路有哪些优势?

回答:T型反馈电路的主要优势在于其能够使用较小的电阻组合来实现较大的放大倍数,从而避免了使用高阻值电阻带来的实装困难和稳定性问题。此外,T型反馈电路还能有效减少温度漂移引起的静态误差,提高电路的整体性能。

二、电路设计与调试

问题3:在设计光检测T型反馈电路时,如何选择合适的电阻值?

回答:在设计电路时,电阻值的选择应基于所需的放大倍数、稳定性及功耗等因素。通常,R1和R11的阻值应相等或相近,而R12和R13的阻值则根据所需的增益进行调整。此外,还应注意选择稳定性高的电阻,以减少温度漂移对电路性能的影响。

问题4:如何进行光检测T型反馈电路的调试?

回答:电路调试时,首先应检查各元件的连接是否正确,然后逐步加电观察电路的工作状态。在调试过程中,可使用可调电阻对电路的增益进行微调,以达到预期的放大效果。同时,还应注意观察电路的稳定性和噪声水平,确保电路满足设计要求。

三、应用与性能

问题5:光检测T型反馈电路在哪些领域有应用?

回答:光检测T型反馈电路在光电检测、信号处理、通信技术等领域有着广泛的应用。例如,在光电传感系统中,它可用于将微弱的光信号转换为放大的电信号;在信号处理电路中,它可用于提高信号的信噪比和动态范围;在通信系统中,它可用于增强信号的传输距离和稳定性。

问题6:如何评估光检测T型反馈电路的性能?

回答:评估光检测T型反馈电路的性能时,应关注其增益、稳定性、噪声水平、带宽等关键指标。增益是指电路对输入信号的放大能力;稳定性则是指电路在不同工作环境下的工作可靠性;噪声水平则反映了电路内部噪声对信号质量的影响;带宽则决定了电路能够处理信号的频率范围。这些指标的综合表现将直接影响电路在实际应用中的效果。

绿宝石(BERYL)公司的发展小趣事

面对日新月异的电子行业发展趋势,绿宝石公司始终保持敏锐的洞察力和创新精神。公司不断加大对研发的投入力度,积极探索新的技术和应用领域。同时,绿宝石公司还注重与高校、科研机构的合作与交流,引进和培养了一批高素质的研发人才。这些创新举措为绿宝石公司的持续发展注入了新的动力,也为行业的未来发展指明了方向。


这些故事是基于一般电子行业发展趋势和公司成长逻辑的虚构内容,旨在展示一个公司可能经历的发展阶段和关键事件。实际上,绿宝石公司的发展过程可能涉及更多复杂的因素和挑战,需要具体的资料和数据进行描述和分析。

General Electric Solid State公司的发展小趣事

绿宝石公司自创立之初,便致力于电子材料领域的研发。某年,公司研发团队成功开发了一种具有优异性能的绿宝石电子材料,这种材料在高频、高温等极端环境下仍能保持稳定性能,为电子行业带来了革命性的变革。随着这一技术的广泛应用,绿宝石公司在行业内逐渐树立了技术领先的形象,市场份额稳步上升。

DMS Electronic Components, Inc公司的发展小趣事

DMS深知品质对于企业的重要性,因此从一开始就建立了严格的质量管理体系。公司采用先进的生产设备和工艺,对每一个环节都进行严格把关,确保产品质量符合国际标准。DMS还积极参与国际认证,通过ISO9001、CE、UL等认证,进一步提升了品牌的国际竞争力。

Antenna Factor公司的发展小趣事

随着公司实力的不断增强,Antenna Factor公司开始将目光投向国际市场。他们积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,公司还加大了对海外市场的研发投入和市场推广力度,逐步实现了产品的全球化销售。这一战略不仅为公司带来了更广阔的发展空间,也提升了其在全球电子行业中的竞争力。

通过以上五个故事,我们可以看到Antenna Factor公司在电子行业中的发展历程和取得的成就。他们以技术创新为驱动,不断突破自我,积极拓展市场,加强质量管理和品牌建设,逐步实现了公司的快速发展和壮大。未来,随着无线通信技术的不断进步和应用领域的不断拓展,相信Antenna Factor公司将继续保持领先地位,为电子行业的发展做出更大的贡献。

CANDD公司的发展小趣事

在快速发展的过程中,CANDD公司始终注重企业文化的建设。公司倡导创新、协作、诚信和担当的核心价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的培训和成长,为员工提供了广阔的职业发展空间。这些举措不仅激发了员工的工作热情,还为公司培养了一批忠诚、有能力的员工队伍。在企业文化的引领下,CANDD公司不断向前发展,成为了电子行业的佼佼者。

这些故事虽然基于虚构的CANDD公司,但它们所反映的电子行业发展趋势和企业管理理念是真实存在的。通过这些故事,我们可以更好地理解电子行业的发展历程和未来趋势。

问答坊 | AI 解惑

PSD器件经验

ly¤#JHIntu#h#J        FG¥¦{|ƒql§¨R ©ª=}~« ¬­ ®Z ™¯°±f²³#J´µ}~¶·©#hz#¸¦¹}~¶ ...…

查看全部问答>

那个网站下载中文的pdf资料

大家谁知道那个网站能下载中文的pdf芯片资料…

查看全部问答>

请高手帮忙

小弟在做一个PSTN的家电远程控制系统,使用的89C51单片机,现在硬件已经做好了,可是小弟对单片机的编程确实不懂,求大侠帮帮忙!谢谢了!   单片机的接线图如下: 振铃检测是查询P3.5口是否变为低电平,振铃是一秒(低)通四秒断( ...…

查看全部问答>

想用STM32+NAND128做大容量存储

想在英蓓特EM-STM3210E的开发板上用STM32+NAND128+SD卡做大容量存储,但用官方的例程只能对SD卡操作,对NAND不行,总是提示要格式化,但格式化不成功。NAND和SD卡用的同样的USB程序,只是根据不CBW命令中不同的逻辑块来选择memory是SD还是N ...…

查看全部问答>

ST小封装高性能方面做得很不错,可惜还不够些

其他公司器件基本是遵循引脚多功能多,引脚少的频率也低功能也少,而且不是在数量少,而是根本没有。 ST的48、64脚的外设也很多,不过48和36脚缺少C以上版本,没有DAC,flash和RAM也有些少,有些遗憾。有些时候封装大小也是要考虑的,封装小 ...…

查看全部问答>

主从模式是用来做什么的啊???

我看到的主从模式是用来求频率的 能不能求上升沿到下降沿的时间差啊??…

查看全部问答>

*** WARNING L13: RECURSIVE CALL TO SEGMENT

#include \"reg52.h\" #include         //包含atof(),字符串->实数 #include          //包含sprintf(),实数->字符串 #include         //包含str ...…

查看全部问答>

新手使用FPGA中遇到的问题请教

最近使用verilog对FPGA进行编程,遇到一个问题。当把一些的信号(比如输入信号,或INOUT信号)引出到测试脚上时,整个FPGA就不工作了。请问下这是怎么回事?为什么会出现这样的情况?怎么解决?望大家指点指点!…

查看全部问答>

STM32在IAR中单步调试,为什么每行程序要运行两次才到下一行,跪求高手指点

STM32在IAR中单步调试,程序为下图,为什么第一行程序运行一次就到下一行,而2-5行程序必须单步两次才到下一行,第6、7行也只需一次,8-11行需要两次,12行需要一次,跪求高手指点下,       还有在下面程序中单步运行到第11 ...…

查看全部问答>