基于STM32的pwmRGB调色程序

http://news.eeworld.com.cn/mcu/ic477174.html


#include "LIGHT/Light.h"
#include "DELAY/Delay.h"
#include "TIMx/TIMx.h"

u16 RGB_buffer[69] = {0};
/**
* 功能:初始灯光
* 参数:
*          brightness:初始化亮度 10-100
*          colortemp:初始化色温 0-100     
*          red:RGB红色比例 0-255
*          green:RGB绿色比例 0-255
*          blue:RGB蓝色比例 0-255   
* 返回值:None
*/
void initLight(u8 brightness,u8 colortemp,u8 red,u8 green,u8 blue)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);    //禁止JTAG保留SWD
    GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);             //设置JTAG为定时器2部分映射,只使用SWD模式

    /*设置冷光灯*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /*设置暖光灯*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /*设置RGB*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    setLight(brightness,colortemp);
    setRGB(red,green,blue);
}

/**
* 功能:设置灯光亮度和色温
* 参数:
*          brightness:亮度 10-100
*          colortemp:色温 0-100         
* 返回值:None
*/
void setLight(u8 brightness,u8 colortemp)
{
    /**
     * 无论是亮度还是色温,最终都体现在LED的亮度上
     * LED最终的亮度计算公式为:满占空比(重装载值) * 亮度百分比 * 色温百分比
     * 并且要保证冷光和暖光的色温比值之和为100%
     * */
    TIM_SetCompare1(TIM2,getPeriod(TIM2)*brightness/100*colortemp/100);         //设置冷光 对应PA15 TIM2_CH1
    TIM_SetCompare2(TIM2,getPeriod(TIM2)*brightness/100*(100-colortemp)/100);   //设置暖光 对应PB3  TIM2_CH2
}


/**
* 功能:设置RGB颜色
* 参数:   
*          red:RGB红色比例 0-255
*          green:RGB绿色比例 0-255
*          blue:RGB蓝色比例 0-255   
* 返回值:None
*/
void setRGB(u8 red,u8 green,u8 blue)
{
    u8 i = 0;
       
    u32 rgb_value = green<<16 | red<<8 | blue;
       
        while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);
        DMA_ClearFlag(DMA1_FLAG_TC1);
       
        DMA_Cmd(DMA1_Channel1, DISABLE);
        DMA_SetCurrDataCounter(DMA1_Channel1,sizeof(RGB_buffer));
    for(i=0;i<24;++i)
    {
        if((rgb_value<<i)&0x800000)     //高位先发,此时高位为1时
        {
            RGB_buffer[i+45] = 61;       //68%占空比           
        }else
        {
            RGB_buffer[i+45] = 28;       //32%占空比
        }
    }
        DMA_Cmd(DMA1_Channel1, ENABLE);
}

 

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于STM32的测速程序主要利用STM32微控制器的定时器、计数器等外设,结合编程实现对物体速度的测量。一般情况下,测速程序需要通过一些传感器或其他装置来获取物体的移动信息,如光电传感器、编码器等。不同传感器获取的信息不同,对应的测速算法也不同。以下简单介绍一下光电传感器的测速原理及程序实现。 光电传感器是一种基于光电原理的传感器。它将物体通过传感器的光电门检测,利用反射光线的变化来判断物体运动的快慢,并将这个信息反馈给STM32微控制器。在程序设计方面,首先需要初始化STM32的定时器和计数器,并设置定时器时钟周期和计数器计数范围。然后设置定时器计数模式和触发条件,当光电门检测到物体时,触发定时器计数器计数,并将计数器的值通过中断或DMA方式传输给STM32的主程序。在主程序中,根据计数器的值和预设参数(如光电门距离、码盘线数等)计算物体的速度,并通过串口、LCD屏幕或其他显示设备输出测速结果。 当然,以上只是测速程序的一个简单实现方法,实际的测速程序还需要考虑到传感器对环境的适应性、不同光电门的检测方式、异常数据处理等多方面因素。在实际应用过程中,还需要对程序进行不断优化和完善,以确保测量结果的准确性和稳定性。 ### 回答2: 基于STM32的测速程序主要是根据编程进行实现。在测速装置方面,一般使用位移传感器或是位置编码器来获取物体运动的速度;在处理器方面,STM32芯片是较为常用的选择之一。因此,通过STM32芯片和相应的编程,就可以实现封装一套基于STM32的测速程序。 具体实现过程分为以下几步: 1.硬件准备:选择一个适合的STM32芯片,连接相应的位移传感器或是位置编码器。 2.编程准备:使用C语言进行编写,先进行外设引脚映射和时钟初始化等设置。 3.编程实现:主要分为两个模块,一个是始终根据位移传感器或位置编码器读取物体位移量或位置量;另一个是测速模块,在一定时间内记录两次物体位移量或位置量,然后根据时间差计算出速度值。 4.调试测试:通过与物体运动实际速度比对,对程序进行调试测试。 基于STM32的测速程序可以用于各种领域,比如自动化系统、机器人、航空航天等。同时,针对具体的应用场景,可以进行更深的优化和改进,比如加入自适应控制或实时数据传输等功能。 ### 回答3: 基于STM32的测速程序可以用来实现对转速、车速、风速等的测量。STM32作为一款嵌入式微控制器,具有低功耗、高效能等特点,适合用于测速应用。 测速程序需要通过传感器采集速度信号,并告知STM32进行处理。可采用光电编码器、霍尔传感器、磁敏传感器等传感器来测量速度信号。采集到速度信号后,需要将其转化为数字信号,通常可以使用计数器来累积速度脉冲数。同时,还需要对脉冲信号进行滤波,以消除信号中的噪声干扰。 处理完速度信号后,可以通过LCD显示或者串口输出等方式,将测量结果展示出来。同时,为了方便用户实现不同测量需求,还可以添加设定测量范围、显示显示单位、测量数据自动压缩存储等功能。 作为一款应用广泛的测量工具,基于STM32的测速程序具有广泛的应用前景。在医学、工业、汽车等领域,都有着广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值