产品概述

单片机th 看单片机如何控制PWM信号实现直流电机转速控制

小编 2024-10-06 产品概述 23 0

看单片机如何控制PWM信号实现直流电机转速控制

设计中采用了专门的芯片组成了PWM信号的发生系统并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节从而控制其输入信号波形等均作了详细的阐述。另外本系统中使用了红外对管对直流电机的转速进行测量,经过整形电路后将测量值送到单片机,并且最终作为反馈值输入到单片机进行PID运算从而实现了对直流电机速度的控制。在软件方面,文章中详细介绍了PID运算程序初始化程序等的编写思路和具体的程序实现。

1 单片机最小系统:单片机最小系统由51单片机,晶振电路,复位电路,电源组成。大家都比较熟悉,这里不再赘述。

2 四位数码管显示:在应用系统中,设计要求不同,使用的LED显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LED显示器供选择,在本设计中,选择4位一体的数码型LED显示器,简称“4-LED”。本系统中前三位显示电压的整数位,最后一位显示转速的小数位。4-LED显示器引脚如图2所示,是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp是小数点引出端,4位一体LED数码显示管的内部结构是由4个单独的LED组成,每个LED的段输出引脚在内部都并联后,引出到器件的外部。

3 电机驱动电路:电机驱动电中是采用ULN2003来驱动。ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。该电路的特点:ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据,输入5VTTL电平,输出可达500mA/50V。ULN2003的引脚图,其中IN1~IN7为输入控制端;OUT1~OUT7为输出端;8脚为芯片的接地端;9脚为公共端,该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。

当P1.0中为高电平时,其内部三极管导通,使电机转动。当P1.0为低电平时,内部三极管截止,电路断开,电机停止转动。所以在程序中可以利用P1.0口输出PWM波来控制电机的转速。

4 红外测速电路:发射管工作时发出红外线,当接收管收到红外信号时,其电阻变小(本设计相当于从无穷大变到1k左右)。利用其电阻变化,改变接收管分压情况。挡片是利用圆盘上剪四个孔,当挡片随电机转动时,接收管两端电平发生变化,产生脉冲。

5 整形电路:本设计的整形电路是用555定时器接成的施密特触发器。

6 源程序:

#include reg52.h

#define uchar unsigned char

#define uint unsigned int

uchar code table[10]={0x3f,0x06,0x5b,

0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示码(0-9)

sbit xiaoshudian=P0^7;

sbit wei1=P2^4; //数码管位选定义

sbit wei2=P2^5;

sbit wei3=P2^6;

sbit wei4=P2^7;

sbit beep=P2^3; //蜂鸣器控制端

sbit motor = P1^0; //电机控制

sbit s1_jiasu = P1^4; //加速按键

sbit s2_jiansu= P1^5; //减速按键

sbit s3_jiting=P1^6; //停止/开始按键

uint pulse_count; //INT0接收到的脉冲数

uint num=0; //num相当于占空比调节的精度

uchar speed[3]; //四位速度值存储

float bianhuasudu; //当前速度(理论计算值)

float reallyspeed; //实际测得的速度

float vv_min=0.0;vv_max=250.0;

float vi_Ref=60.0; //给定值

float vi_PreError,vi_PreDerror;

uint pwm=100; //相当于占空比标志变量

int sample_time=0; //采样标志

float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,积分,微分常数

void delay (uint z)

{

uint x,y;

for(x=z;x0;x--)

for (y=20;y0;y--);

}

void time_init()

{

ET1=1; //允许定时器T1中断

ET0=1; //允许定时器T0中断

TMOD = 0x15; //定时器0计数,模式1;定时器1定时,模式1

TH1 = (65536-100)/256; //定时器1值,负责PID中断 ,0.1ms定时

TL1 = (65536-100)%6;

TR0 = 1; //开定时器

TR1 = 1;

IP=0X08; //定时器1为高优级

EA=1; //开总中断

}

void keyscan()

{

float j;

if(s1_jiasu==0) //加速

{

delay(20);

if(s1_jiasu==0)

vi_Ref+=10;

j=vi_Ref;

}

while(s1_jiasu==0);

if(s2_jiansu==0) //减速

{

delay(20);

if(s2_jiansu==0)

vi_Ref-=10;

j=vi_Ref;

}

while(s2_jiansu==0);

if(s3_jiting==0)

{

delay(20);

motor=0;

P1=0X00;

P3=0X00;

P0=0x00;

}

while(s3_jiting==0);

}

float v_PIDCalc(float vi_Ref,float vi_SpeedBack)

{

register float error1,d_error,dd_error;

error1=vi_Ref-vi_SpeedBack; //偏差的计算

d_error=error1-vi_PreError; //误差的偏差

dd_error=d_error-vi_PreDerror; //误差变化率

vi_PreError=error1; //存储当前偏差

vi_PreDerror=d_error;

bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);

return (bianhuasudu);

}

void v_Display()

{

uint sudu;

sudu=(int)(reallyspeed*10); //乘以10之后强制转化成整型

speed[3]=sudu/1000; //百位

speed[2]=(sudu00)/100; //十位

speed[1]=(sudu0)/10; //个位

speed[0]=sudu; //小数点后一位

wei1=0; //第一位打开

P0=table[speed[3]];

delay(5);

wei1=1; //第一位关闭

wei2=0;

P0=table[speed[2]];

delay(5);

wei2=1;

wei3=0;

P0=table[speed[1]];

xiaoshudian=1;

delay(5);

wei3=1;

wei4=0;

P0=table[speed[0]];

delay(5);

wei4=1;

}

void BEEP()

{

if((reallyspeed)=vi_Ref+5||(reallyspeed

{

beep=~beep;

delay(4);

}

}

void main()

{

time_init();

motor=0;

while(1)

{

v_Display();

BEEP();

}

if(s3_jiting==0) //对按键3进行扫描,增强急停效果

{

delay(20);

motor=0;

P1=0X00;

P3=0X00;

P0=0x00;

}

while(s3_jiting==0);

}

void timer0() interrupt 1

{

}

void timer1() interrupt 3

{

TH1 = (65536-100)/256; //1ms定时

TL1 = (65536-100)%6;

sample_time++;

if(sample_time==5000) //采样时间0.1ms*5000=0.5s

{

TR0=0; //关闭定时器0

sample_time=0;

pulse_count=TH0*255+TL0; //保存当前脉冲数

keyscan(); //扫描按键

reallyspeed=pulse_count/(4*0.6); //计算速度

pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);

if(pwm

if(pwm100)pwm=100;

TH0=TL0=0;

TR0=1; //开启定时器0

}

num++;

if(num==pwm) //此处的num值,就是占空比

{

motor=0;

}

if(num==100) //100相当于占空比调节的精度

{

num=0;

motor=1;

}

}

我在高职教STM32——02一览STM32的重要功能

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学 。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感 的想法。在这里,我准备陆续把自己花了很多心思设计的教学设计分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!#我要上微头条##STM32##高职高专#

PS:本人给学生上课选用的洋桃工作室的“洋桃1号”STM32开发板,因此本文所使用的很多图片资料来自厂家,本人只是做了整理和编辑工作,供学习交流之用,无广告之意,特此声明。

一、STM32的命名——探探芯片型号代表的含义

STM32芯片命名规范

STM32命名解读

公司与产品系列(STM)

意法半导体是一家国际性的半导体生产商,总部位于瑞士日内瓦。ST算是家大公司了,他们不仅生产微控制器,还生产二极管、放大器、无线模块之类的电子元器件,STM只表示ST公司微控制器这一品类的命名。

STM系列官网一览

微控制器类型(F)

微控制器的类型,大概说就是芯片的主要应用方向,如用于简单功能开发的S系列、用于低功耗的L系列、用于高性能的H系列、用于没什么特殊需求的通用F系列。

F类型的微控制器在性能、功能、功耗、价格方面比较平衡,哪项也不突出,哪项也不缺少,尽量满足所有需要微控制器的场合。

STM32系列应用定位

子系列(103)

STM32系列资源一览

引脚数、存储量与封装(C8T)

需要注意:只要是STM32F103子系列,不管引脚数量多少,都具有完全一致的性能和功能。初学者会误以为引脚多的芯片功能多,其实功能多少并不和引脚数量有关,只能说引脚少的芯片可能某些你需要的功能接口没有引出来。在满足功能的前提下,使用引脚最少的芯片是最佳选择。

STM32系列存储资源与封装一览

工作温度(6) 商业用范围:0~75℃工业级范围:-40~85℃汽车工业级范围:-40~125℃军工级范围:-55~150℃

目前工业级范围的单片机是最常见的,一般的民用、商用、工业用电子产品都采用这个温度范围。

二、内核与存储器——反映的是处理器最重要的性能

Cortex-M3处理器内部架构

Cortex-M3内核功能模块

标准化的微控制器核心ARM公司作为顶层的架构设计者,需要最大程度的整合各家芯片制造商对微控制器的解决方案。因此,Cortex-M3在CPU的基础上又提供了整个微控制器的核心部分,包括系统节拍时钟、并行总线结构、嵌套中断向量控制单元(NVIC)、调试系统以及存储区映射等。STM32F1系列是Cortex-M3架构的杰出代表STM32F1是ST公司第一个基于Cortex-M3内核的微控制器系列,它的出现将微控制器的性价比水平提升到了新高度,同时它在低功耗场合和实时控制场合中亦能游刃有余。STM32F1的核心功能 内核:ARM 32位的Cortex-M3 CPU① 最高72MHz工作频率,在存储器的0等待周期访问时可达1.25DMips/MHz(Dhrystone 2.1)。② 单周期乘法和硬件除法存储器① 64K或128K字节的闪存程序存储器② 高达20K字节的SRAM说说SRAM与FLASH

CPU访问SRAM和FLASH

SRAM和FLASH特性对比

三、时钟、复位和电源管理——时钟是灵魂、复位是刚需、电源是必备

时钟的重要性 时钟是指处理器工作的基准频率的来源由一个电路(芯片内部或外部都可)产生类似脉搏的脉冲信号,一下一下有规律地稳定地跳动,单片机中所有功能组件都需要将这个跳动作为其工作的标准。处理器的运行速度取决于时钟频率① 图中的方波由高到低再到高(图中tHSE的部分),就是一个时钟周期。② 在一个时钟周期内,处理器能运行一条“单周期”指令;还有一些“多周期”的指令需要多个时钟周期才能执行完毕。③ 时钟频率越高,处理器执行指令越快,所表示出的运行速度就越快。

STM32的时钟周期

STM32的时钟源 时钟源在电路实现的层面上分为振荡器和分(倍)频器,它们两个共同决定了时钟频率。这两种方式STM32都有。振荡器是一种可以产生固定频率方波的硬件电路;分(倍)频器的工作是把振荡器的频率等分(或成倍)为其他规格的频率。表中的RTC是“实时时钟“的英文缩写,从处理器技术层面来说是指可以记录日期时间的时钟,与常说的处理器时钟不是一回事。

STM32的时钟源

STM32的时钟树

STM32的时钟树

上图说明了STM32的时钟走向,从图左边的时钟源开始,一步步分配到右边的外设时钟。我们暂时不去详解每个走向,但这相对于51单片机的单一时钟源来说,其复杂度不可同日而语,为什么非要这么设计?

需要倍频是考虑到电磁兼容性,如果外部直接给一个高速晶振(不一定造的出来),太高的振荡频率会给电路制板带来较大难度。分频是因为STM32既有高速外设又有低速外设,需要分开管理。每个外设都配备了时钟开关,不用时可以关闭,这样有利于降低整体功耗。所以,当要使用某个外设时,记得一定要开启对应的外设时钟。STM32的复位 复位的作用复位的作用就是让单片机内部秩序化(RAM里的数据清空),都回到设计者规定好的状态,就像计算机每次重启一样。STM32复位的情形① STM32 单片机中,有一个供电监控器在一直工作,它能监测外部电源的电压,当电压低于2V 时,监控器会让单片机复位。当电压高于2V 时,监控器让单片机进入工作状态。② 每次给单片机接通电源时,电压都是一次从0 升到3.3V(STM32 的工作电压)的过程,这个过程使单片机复位。因此,可以不需要再外接复位电路。③ 通常是在单片机的复位引脚上接一个微动开关,开关另一端接地,按下开关可手动复位。

STM32复位引脚与接线

STM32的电源管理

STM32的电源

逻辑电源输入① 这是单片机最基本的供电输入端口,用 VDD 表示。② 给这些接口提供 2~3.6V 的直流电压,就能让内核、存储器、I/O 端口和其他纯数字电路工作了。③ 它还能让I/O 端口输入或输出数字逻辑信号的电平。模拟电源输入① 模拟电源电压用 VDDA 表示,用在 ADC、RC 振荡器、PLL 等模拟电路上,因此对电源的稳定性要求较高。② 64脚以上单片机的模拟电源与逻辑电源是分开的。③ 引脚较少的单片机上,逻辑电源和模拟电源并联在一起使用,以减少引脚的占用。备用电源输入① 这是专门给实时时钟(RTC)供电的,以保证在逻辑电源断开后依然让RTC 保持走时。② 同时它也给唤醒电路和后备寄存器供电,让它们一直处在工作状态。③ 一般外接独立电源或者一块1.8~3.6V 的纽扣电池。

四、低功耗与ADC——煞费苦心的低功耗设计,高精度模数转换

STM32的低功耗设计 低功耗是物联网设备的普遍需求物联网终端设备大都采用电池供电,降低功耗、让电量使用更持久便成了重要的项目需求。因此,单片机内部的低功耗设计也是每个芯片厂商不懈努力的方向。STM32的低功耗模式STM32 单片机可以通过关掉一些耗电大的内部功能来达到省电的目的,根据关掉的功能数量,可分为3 种低功耗模式:睡眠模式、停机模式、待机模式。

STM32的三种低功耗模式

STM32的ADC(模数转换器) ADC的功能读取端口上模拟量的电压值,类似于电压表。I/O端口上的逻辑电平I/O 端口是输入或输出逻辑电平的,也就是高电平(1)和低电平(0)电压值的精度① ADC 可以读出从0V 到电源电压之间的具体电压值,并把这个值变成一组数字量(8位、10 位、12 位甚至更高)。② 位数越多,表示测得的电压值更精密。STM32 的ADC 是12 位的,其精度能够满足大部分应用了。

STM32读取的模拟电压

五、DMA与I/O口——为CPU减负的好助手DMA,几乎全能的GPIO

DMA可大大提高内核工作效率① DMA 字面意思是“直接存储器访问“,通常用在外设与内核需要进行大量数据传输的场合。② 如果没有DMA,想读取ADC 的值,首先要在内核向ADC 功能发出指令,然后等待ADC 读取完成,内核再从ADC 读出数据,再存放到SRAM 当中。这个过程需要内核参与,占用了内核的时间,内核就不能去做别的工作了。③ DMA 可以在这种数据读取、存放的任务上完全解放内核。它能按预先设定好的设置从ADC 读出数据,然后自动存放到SRAM 中指定的位置,不需要内核的参与。当内核需要ADC 的数据时,只要读SRAM 指定的位置这一步操作就行了。

STM32的DMA工作示意

STM32的DMA通道① DMA 不仅能读ADC,它还能在Flash、SRAM、SPI、USART、定时器、I2C 等功能之间相互传递数据。② STM32F103 的DMA 有7 个通道,可以设置7 组数据传递任务。

STM32的DMA通道示意

STM32的I/O数量与分组① 近乎全能的I/O口学习单片机最先接触的往往就是I/O端口,它是内部功能当中最重要的一块。因为I/O端口也可以代替除ADC之外所有的逻辑电平的通信接口,所以在STM32里叫GPIO(通用输入/输出端口)。② STM32F103最多有80个I/O端口,被分成5组,每组16个。STM32F103C8T6只有37个I/O 端口,其中PA和PB的16个端口都引出了,PC组只引出3个,PD组只引出2个。

48脚封装的STM32F1芯片的引脚

GPIO的工作模式每一个I/O 口都有8 种工作模式,也就是I/O 口的状态是输出还是输入?是输入的话,是模拟量输入还是逻辑电平输入?编程时,我们需要在启动I/O 口之前先把它设置成正确的状态。

STM32 I/O口的8种工作模式

四种输入模式:* 模拟输入是在作ADC 输入接口时使用的* 浮空输入是内部不接电阻* 下拉和上拉输入是在I/O 内部接一个10kΩ 的下拉或上拉电阻,根据外部连接的电路可以设置它们。四种输出模式* 推挽是指I/O 端口有很强的电流推动能力,可以输出一定量的电流,用于推动一些元器件(如LED)工作。* 开漏则是弱电流的输出,用于逻辑电平的数据信号通信* 复用的推挽和开漏是用在复用状态下的。

六、调试模式与定时器——仿真调试除BUG,定时资源多又强

ARM的仿真调试接口 什么是仿真所谓仿真,就是不把程序下载到Flash 里,而是在计算机端直接控制单片机内核,使单片机能达到和运行下载到Flash 里的程序一样的工作效果。因为不是真的运行程序,而是在计算机上模拟的,所以叫仿真。JTAG调试接口不仅是STM32,所有的ARM 内核的单片机都有一组用于仿真调试的接口,它叫JTAG(Joint Test Action Group,联合测试工作组,是一种国际标准测试协议,主要用于芯片内部测试)。

STM32的JTAG与SWD调试接口

JTAG的简化接口——SWDJTAG 是内核的一部分,并不是一个独立的功能。连接上,可以用5 线的标准JATG,也可以用简化为2 线的SWD,它们的功能是一样的,只是连接方式不同。

ST-LINK仿真器与连接线

强大的定时器资源 定时器的本质定时器的本质是计时,当达到设置的时间后去做某个事情。定时器如何知道时长① 主要是通过系统时钟,时钟产生机器周期,内核以机器周期为单位工作,定时器也以此计数,所以定时器也被说成计数器。② 当定时器到达了设置的数值时,就会产生一个中断或事件。多达7个定时器STM32F103xxx 增强型系列包含:3个普通定时器、1个高级定时器、2个看门狗定时器、1个系统滴答定时器。

STM32的定时器资源

普通定时器和高级定时器不仅能计数和定时,还能做很多复杂的工作,待讲到定时器编程的时候再展开。看门狗定时器的作用是在定时时间到了之后让单片机复位。嘀嗒定时器,用于实时操作系统中的任务切换的。如果没有跑操作系统,那么嘀嗒定时器可以作为普通定时器来使用。

七、看门狗与滴答定时器——保护内核的忠实伙伴与操作系统的心跳

保护内核的忠实伙伴 —— 看门狗 看门狗的本质和作用看门狗是一种形象的名称,其本质是一种特殊的定时器。看门狗定时器的作用是在定时时间到了之后让单片机复位。单片机正常工作时为了保证单片机程序不会跑飞,我们会加入一段“喂狗”程序,即不断把看门狗定时器的计数值清0。因此,单片机程序正常时,看门狗是不会让单片机复位的。单片机程序异常时如果单片机不正常工作了,比如程序有错或外部干扰导致死机,这种情况看门狗定时器的计数值无法清0,一段时间后(编程设置)单片机就会被复位,看门狗定时器就把单片机从死机状态中解救出来了。操作系统的“心跳” —— 滴答定时器 滴答定时器对操作系统尤为重要操作系统需要一个“时基”,从而可以为多个任务分配不同数目的时间片,或者将某个时间范围赋予特定的任务等。这个“时基”就由这个滴答定时器来提供。滴答定时器属于CM3内核部件所有采用CM3 内核的芯片都带有这个定时器,使软件在不同芯片厂商的CM3器件间的移植工作得以简化。滴答定时器也能当做普通定时器当STM32 单片机没有跑操作系统,那么嘀嗒定时器可以作为普通定时器来使用。几乎每个实验都要用到的延时函数就是通过滴答定时器实现的。

八、I2C与USART接口——一主多从的低速通信协议I2C,最简单最常用的有线通信之串口

STM32支持的通信协议 通信的硬件层面在硬件上的是通信接口,即通信需要几条连接线、单片机与芯片之间怎样连接。像串口下载、外部Flash存储器、TF卡、OLED显示屏、传感器这些模块/芯片与单片机之间需要交换的数据太多,那么通过GPIO端口简单的高低电平来表示是不够的。通信的软件层面在软件上的是协议规范,也就是以什么样的逻辑电平方式通信。比如发送高电平代表什么、连发3 个高电平代表什么,只有收发双方使用相同的规范,通信才能进行。这时就需要用到专门的通信接口,虽然通信接口也是输入/输出逻辑电平,但是它们都按照一个固定的格式规范来通信。这种通信的格式规范叫作“通信协议”。I2C总线

I2C总线(读作“I 方C”或“I2C”)是飞利浦公司发布的一款通信总线标准。所谓总线,是指在一条数据线上同时并联多个设备(芯片或模块)。

主设备和从设备① 每一组I2C总线上只能有1个主设备,主设备是主导通信的,它能主动读取各个从设备上的数据。② 从设备只能等待主设备对自己读写,如果主设备无操作,从设备自己不能操作总线。从设备的数量和识别① I2C总线理论上可挂接几百个从设备,每个从设备都有一个固定的7位或10位从设备地址,相当于身份证号码。② 主机想读写哪个从设备,就向所有从设备发送一个从设备地址,只有号码一致的从设备才会回应主设备。通信速度低速模式可达100kHz,快速模式可达400kHz,高速模式可达3.4MHz。后两者不太稳定,常用低速模式。

STM32的I2C通信示意

I2C的优点是协议简单易学,相关的芯片模块成本低,在只占用2个I/O端口的情况下可挂接上百个从设备。目前有很多EEPROM 存储器、温度传感器、RTC时钟、气压传感器等都使用I2C总线作通信接口。

STM32F103单片机内部有2个I2C总线控制器,都支持DMA功能,在硬件上完成了I2C的通信协议,用户只需要在指定的I2C寄存器中写入从设备的地址和要读写的数据就行了,余下的工作会自动完成。

USART串口

STM32的串口通信

TTL电平直连多用于单片机与带有USART串口的模块通信,比如Wi-Fi模块、GPS模块、蓝牙模块都支持USART串口。另外它还常用于单片机与计算机的通信,今后我们用计算机给单片机下载程序,就是通过USART串口完成。RS232接口常见于计算机和工控设备之间的通信。该接口并没有改变USART串口的协议规范,而是通过专用的RS232转换芯片,把TTL电平转换成了±12V电平,使通信的距离和稳定性都有所提高。RS485的传输速度和距离比RS232还要大很多,而且可用于多个设备的通信,如高层住宅和商场里的电梯就是用RS485连接各楼层,控制叫梯和显示楼层信息。开发板上的RS232与RS485接口

九、SPI、CAN、USB接口——高速串行通信方式几乎通杀

SPI总线 SPI与I2C对比SPI和I2C一样是一种总线。SPI总线也有主设备和从设备之分,单片机是主设备,各种周边芯片是从设备。SPI和I2C一样是板级总线,也就是只能在PCB上近距离通信,而不能引出导线到较远的距离。SPI最大的优势是有很高的通信速度,而且在高速下还能稳定工作,这是I2C所不能的。

SPI总线连接示意

SPI高速通信的原因① SPI之所以有这样的速度优势,正是因为它没有采用地址的概念,不在通信数据里放入地址信息,而是使用硬件来选择总线上的设备。每个SPI从设备都有一条开关控制线与主设备(单片机)独立连接(图中的CS线)。当主设备想与哪个从设备通信时,只要开启那个从设备的开关控制线,总线上就只有这个设备是开启的,总线变成了一对一通信。正是用硬件选择从设备,才让SPI总线协议简单、速度飞快② SPI速度快的另一个原因是全双工。全双工的意思是总线在通信时能同时收发数据。而I2C总线是半双工的,不能同时收发。如果把总线通信比喻成两个人对话,半双工状态就是我说你听,或者你听我说,同一时间只有一人在说;全双工状态就是两个人同时说话,又同时听对方讲话。这样对话效率要高得多,只可惜人脑没有这么快的反应速度,生活中也看不到这样的对话。但是单片机能全双工通信,所以全双工的SPI在速度上很难被其他总线超越。STM32的SPI还有哪些特点STM32F103单片机上有2个SPI总线,最大速度可达18MB/s,而且还支持DMA功能和SD卡读写功能。我们常见的SD卡(或TF卡)都支持SPI模式,可以用SPI总线直接读写卡上的数据。SPI总线在高速通信上有非常大的优势,只可惜受到控制从设备的I/O端口数量的限制,总线上不能挂接太多从设备。CAN总线 CAN总线是高级智能总线CAN总线是一种工业控制、汽车电子上常用的高级总线,之所以说它高级,是因为CAN总线的功能复杂且智能。以下CAN总线的电路连接示意图,CAN总线只需要两条导线,理论上可以连接无限多的设备,每一个设备即可作主设备,也可作从设备。CAN总线的通信距离可达10km,速度可达1MB/s。听上去好像速度比SPI的18MB/s 差得很远,但CAN是远程通信,1MB/s的速度已经很优秀了。

CAN总线连接示意

CAN总线强大且稳定另外,CAN总线的功能也很强大,当总线上的某个设备损坏时,总线可以把这个设备从总线上断开。在我看来,CAN总线算是RS485总线的升级版,RS485是开放的、原始的底层协议,虽然简单,但功能太少。CAN总线加入了区分总线上设备的标识符概念,也加入了更复杂的协议规范。这让用户在使用CAN时更方便了,不用自己设计总线地址之类。CAN总线的工作很稳定,在汽车行业中被用于车内各电子设备的通信。USB接口 STM32只能是USB从设备USB 接口是大家再熟悉不过的了,所有计算机上都会有至少1个USB接口,因为USB 接口正是为计算机与周边设备(如U盘、鼠标、打印机)通信而设计的。而STM32F103单片机上有1个USB 2.0接口,它被定义为USB从设备,也就是说,它只能用来与计算机连接来作计算机周边设备,比如用STM32制作鼠标或打印机。USB虽然不是总线,但它和CAN总线一样都有底层非常复杂的通信协议,但在用户使用层面上又变得比较简单。STM32与电脑USB的连接下图是USB接口的电路连接示意图,从中可以看出USB有2条数据线,另外还有2条电源线,可以由计算机端给USB设备(单片机)供电。USB接口与之前讲到的USART串口都能与计算机通信,可是USB接口有明确的主从关系,单片机只能作为计算机的从设备。而USART串口的通信没有主从关系,计算机与单片机的通信是平等的,任何一方都能主动发出数据。

USB接口电路连接示意

十、内部功能小结——梳理各模块的主要用途和彼此联系

通过以上内容,我们大致了解了STM32内部每个功能的特性和用途,初学者有些概念不理解也不要紧,脑子里有个大概印象即可,等系统学习各功能编程的时候再回过头来看看,也许就会多一分领悟。最后,我们把STM32数据手册中的内部功能关系框图摘出来标注一下,仔细研究这张框图,彻底了解所有内部功能之间的关系,可以帮助我们清晰地认识这款单片机,再学习某些知识时会有更深刻的理解和记忆。

STM32内部功能关系框图

相关问答

51 单片机th 1和tl1是什么定时器?

51单片机th1和tl1是专用寄存器因为16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。其访问地址依次为8AH-8DH。每个寄...

单片机 振荡频率计算?

3、工作在方式0下:最大计数值是2^13=8192;4、定时初值=8192-(1*1000)=7192;5、换算成十六进制数为:定时初值=1C18H。定时器中断是由单片机中的定...4、定.....

TH 0=0是什么意思?

意思是单片机计数器0的高8位寄存器。TH0代表定时器高八位,TH是timerhign的简称。单片机(Single-ChipMicrocomputer)是一种集成电路芯片,是采用超大规模集成...

使用protues做 单片机 仿真时遇到的问题仿真时出现如下带一个...

[最佳回答]哥们,你把它提到英语考试这里来干啥?自己谷歌翻译吧,有必要问吗?

51 单片机 ,按键控制流水灯程序,懂的进!八个LED灯与 单片机 P1口...

[最佳回答]假如,你的程序在执行key_scan();是触发了两次中断导致num>20,你的显示函数将永远被跳过,你应该写成if(num>20)��{���num=0;���display();�.....

555 单片机 原理?

555单片机是一种集成电路芯片,它由多种元件构成,包括比较器、RS触发器、电压比较器等。它主要用于产生时序信号,例如脉冲、周期性波形、计时等方面的应用。...

C语言 单片机 用定时器输出3KHz方波的程序 - 懂得

先开总中断然后再打开定时器0#includesbita=P1^0;main(){a=1;TMOD=0X02;//定时器0自动重装载TH0=256-167;TL0=256-167;ET0=1;//定...

单片机 中断初始化是什么意思?

定时器/计数器的初始化在使用8051系列单片机的定时器/计数器前,首先要对TMOD和TCON寄存器进行初始化,同时还必须计算定时的时间(重点)。(1)确定T/C...

555计数器的thr是什么意思?

答:555单片机定时器ET是内部定时器/计数器中断允许位。EA是总中断允许位,EX是外部中断允许位(EX0,EX1分别指外部中断INT0,INT1),ET是内部定时器/计数器中...

单片机 汇编指令ACALL怎么用?

ALL是51汇编的子程序调用指令,其使用范围是±2K范围,超出这个范围的调用将会出错,这时可以使用LCALL即长调用语句。调用格式如下:ACALL标号(子程序名)例...

猜你喜欢