datasheet

W5500通过上位机控制实现调节LED灯带的亮度

2018-04-28来源: eefocus关键字:W5500  上位机控制  调节LED灯带

该实验采用W5500开发板通过上位机向开发板发送命令来控制外接灯带的亮度;主要的过程如下:

1 实验目的

上位机通过串口发送格式为:“redbrightness,greenbrightness,bluebrightness”的字符串到MCU。MCU将数字转化成相应的亮度。

2 实验总体设计

实验主要分两个部分:PWM配置以及串口通信配置。整个实验的难点在于ASCII码转换为数字的过程。

3 PWM产生原理

通用定时器可以利用GPIO引脚进行脉冲输出。要使STM32的通用定时器TIMx产生PWM输出,需要用到3个寄存器。分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。(注意,还有个TIMx的ARR寄存器是用来控制pwm的输出频率)。

对于捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有2个,TIMx _CCMR1和TIMx _CCMR2。TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和4。其次是捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。

最后是捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有4个,对应4个输通道CH1~4。4个寄存器作用相近,都是用来设置pwm的占空比的。例如,若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1) 。

4  PWM配置步骤
4.1 配置GPIO

void LED_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);//开启复用时钟

 

GPIO_InitStructure.GPIO_Pin =  LED_RED| LED_BLUE | LED_GREEN;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOC, &GPIO_InitStructure);

 

GPIO_SetBits(GPIOC, LED_RED | LED_BLUE | LED_GREEN);

}

4.2  配置定时器

void TIMER_Config(void)

{

TIM_TimeBaseInitTypeDef     TIM_BaseInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

 

GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

 

TIM_BaseInitStructure.TIM_Period = 255;

TIM_BaseInitStructure.TIM_Prescaler = 0;

TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

 

TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);

TIM_ARRPreloadConfig(TIM3, ENABLE);

TIM_Cmd(TIM3, ENABLE);

}

4.3 配置PWM

void PWM_Config(void)

{

TIM_OCInitTypeDef  TIM_OCInitStructure;

 

TIM_OCStructInit(&TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = 0;

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;              //选择模式1

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low      //极性为高电平有效

 

TIM_OC2Init(TIM3, &TIM_OCInitStructure);

TIM_OC3Init(TIM3, &TIM_OCInitStructure);

TIM_OC4Init(TIM3, &TIM_OCInitStructure);

 

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);

 

TIM_CtrlPWMOutputs(TIM3,ENABLE);

 

}

4.4 小结

PWM模式1:

在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

PWM模式2:

在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。

同时输出的有效点评还与极性配置有关:

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

此配置是高电平为有效电平,反之亦然。

5         UART配置步骤
5.1          配置UART1以及对应的GPIO

void Usart_Config(uint32_t BaudRate)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

 

USART_InitStructure.USART_BaudRate = BaudRate;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

 

USART_Init(USART_PC, &USART_InitStructure);

 

USART_ITConfig(USART_PC, USART_IT_RXNE, ENABLE);  //开启串口接收中断

USART_ITConfig(USART_PC, USART_IT_IDLE, ENABLE);  //开启串口接收中断

 

USART_Cmd(USART_PC, ENABLE);

}

5.2 配置中断

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

 

 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

 

 

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

5.3 中断函数

void USART1_IRQHandler(void)

{

uint8_t clear = clear;

 

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

{

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

 

RxBuffer[RxCounter++] = USART_ReceiveData(USART1);

}

else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)

{

clear = USART1->SR;

clear = USART1->DR;      //先读SR再读DR,为了清除IDLE中断

RxNumber = RxCounter;

RxCounter = 0;            //计数清零

IDLE_Flag = 1;        //标记接收到一帧的数据

}

}

5.4 小结

STM32单片机可以实现接收不定长度字节数据。由于STM32单片机带IDLE中断,利用这个中断,可以接收不定长字节的数据。由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。

IDLE就是串口收到一帧数据后,发生的中断。比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。 一帧数据结束后,就会产生IDLE中断。这个中断十分有用,可以省去了好多判断的麻烦。

6 ASCII码转换为数字
6.1 实现步骤:

 

while(RxBuffer[i] !=  ','){     i++;  len++;}//如果不为','长度加1

 

for(j=i-len; j

value = RxBuffer[j]&0x0f;         //将ascii码转换为数字

pwm_red += value * Power(len-1);

len--;

}

i++;

len = 0;

 

 

while(RxBuffer[i] !=  ','){         i++;  len++;}

 

for(j=i-len; j

value = RxBuffer[j]&0x0f;         //将ascii码转换为数字

pwm_green += value * Power(len-1);

len--;

}

 

i++;

len = 0;

 

 

while(RxBuffer[i] !=  '\0'){      i++;  len++;}

 

for(j=i-len; j

value = RxBuffer[j]&0x0f;         //将ascii码转换为数字

pwm_blue += value * Power(len-1);

len--;

}

 

RedOutput(pwm_red);

GreenOutput(pwm_green);

BlueOutput(pwm_blue);

 

pwm_red = 0;

pwm_green = 0;

pwm_blue = 0;

 

for(i=0; i<11; i++)               RxBuffer[i] = NULL;//清除数组

 

i = 0;

len = 0;

}

}

}

6.2 10的n次方函数

uint8_t Power(uint8_t pow)

{

uint8_t i;

uint8_t sum = 1;

 

for(i=0; i

 

return sum;

}


关键字:W5500  上位机控制  调节LED灯带

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2018042838870.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Uip在STM32平台移植之建立UDP链接
下一篇:STM32NET学习笔记 IP ICMP部分

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Tim Cook暗悄悄地更新产品线

——Apple Watch到第四代才支持虚拟蜂窝网络,iPhone经典的Home键设计直到17年发布的X上的FaceID被取代,苹果仍然秉承着“你大爷还是你大爷”的风格,留了几手是完全猜不到的。 所以,对AirPods的更新,我们可以把眼光放在更硬核的部分:这颗名为H1的芯片,究竟对比之前的W1,有怎样的变化? 我们先来回顾一下上代AirPods上使用的W1芯片是个什么玩意儿。事实上哪怕科学上网找了个遍,从9to5Mac这样的专业苹果媒体到各种路边社,都没看到对这块芯片有多少干货解读,苹果从来不喜欢用参数说话,更不用提这是一颗独家占有的芯片。但从TechInsights的AirPods拆解中我们可以发现一些蛛丝马迹
发表于 2019-03-25
Tim Cook暗悄悄地更新产品线

重量级线程应用处理专家—英特尔®至强™W-3175X处理器

英特尔今天宣布推出英特尔®至强™W-3175X处理器。这是一款28核心的未锁频工作站处理器,堪称工作站动力工厂,专为建筑和工业设计以及专业内容创建等特殊的多线程和计算密集型应用所打造。 英特尔®至强™W-3175X处理器专为处理重量级线程应用和任务而打造,为最前沿的专业创建者及其工作负载带来毫不妥协的世界级单核及全核心性能。 产品亮点 凭借比英特尔桌面处理器拥有更多的核心数、线程数、CPU PCIe通道数量以及内存性能,英特尔®至强™W-3175X处理器拥有诸如视频编辑及3D渲染等任务量繁重的大规模项目所需的性能特性。其他关键性能如下: ·    
发表于 2019-01-31
重量级线程应用处理专家—英特尔®至强™W-3175X处理器

SPI专题(二)——STM32驱动FLASH(W25Q64)

;        //等待芯片擦除结束}   /************************************************///擦除一个扇区//Dst_Addr:扇区地址 0~511 for w25x16//擦除一个山区的最少时间:150msvoid SPI_Flash_Erase_Sector(u32 Dst_Addr)   {       Dst_Addr*=4096;    SPI_FLASH_Write_Enable();       
发表于 2019-01-09
SPI专题(二)——STM32驱动FLASH(W25Q64)

stm32 SPI-FLASH W25Q64

W25Q64SPI配置步骤1.使能SPI时钟2.使能GPIO端口时钟3.初始化GPIO,配置引脚模式4.初始化SPI5.使能SPI6.SPI读写数据7.查看SPI传输状态举例typedef struct{ uint16_t SPI_Direction; uint16_t SPI_Mode;  uint16_t SPI_DataSize; //数据帧格式 uint16_t SPI_CPOL; //时钟极性 uint16_t SPI_CPHA; //时钟相位 uint16_t SPI_NSS; //软件从设备管理 uint16_t SPI_BaudRatePrescaler; //波特率控制 uint16_t
发表于 2019-01-04
stm32 SPI-FLASH W25Q64

三星 SM-W737Y 平板电脑曝光,支持 LTE 和蓝牙 5.0

集微网消息,近日有外媒报道成,三星三星画出了准备推出新款 Android 平板电脑外,还正积极筹备着一款型号为 SM-W737Y 的平板电脑,并刚刚通过 FCC 认证。从相关消息中得悉,这款平板电脑将会预装Windows 10 操作系统,并支持 WCDMA/LTE/蓝牙 5.0 连接。据爆料人士 Abhijeet Mishra  指,这款代号为 SM-W737Y 的平板电脑将会是 2018 年推出的三星 Galaxy Book 2 的变种之一,尽管目前尚未有更多细节流出,但这款设备近期已经通过了 Wifi 认证。此外,关于该平板的支持页面已经在新西兰和澳大利亚的三星官网上抢先发布,相信这款平板距离与大家正式见面的时间已经
发表于 2018-12-19
三星 SM-W737Y 平板电脑曝光,支持 LTE 和蓝牙 5.0

华为20W快充功率出炉

。目前手机市场上按照充电功率大小的顺序排列分别为:50W的Super VOOC闪充(OPPO)>40W的SuperCharge(华为)>22.5W的半压闪充(vivo)>18W的QC3.0(高通)>15W的AFC(三星)>10W的QC2.0(高通)>5W(苹果),这样看来华为的20W快充虽然谈不上先进,但是还是比QC3.0之类的强。对华为品牌感兴趣的用户可以期待明年登场的20W快充,钟爱小米等品牌的用户也别灰心,高通前不久公布了2019年手机快充技术预览,手机将会从有线、无线充电推进到更高瓦数的快充:有线将会从目前QC4的18W提升到32W,无线充电功率从12W提升至15W水平。看来明年手机的快充功率
发表于 2018-12-14
华为20W快充功率出炉

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved