您的位置 首页 报告

怎么经过W5500开发板操控外接灯带的亮度

如何通过W5500开发板控制外接灯带的亮度-该实验采用 W5500 开发板通过上位机向开发板发送命令来控制外接灯带的亮度;主要的过程如下: 1实验目的 上位机通过串口发送格式为:“redbrightness,greenbrightness,bluebrightness”的字符串到MCU。MCU将数字转化成相应的亮度。 2实验总体设计 实验主要分两个部分:PWM配置以及串口通信配置。

该试验选用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的输出频率)。

怎么经过W5500开发板操控外接灯带的亮度

关于捕获/比较形式寄存器(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;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/347919.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部