系统概要
在该系统中,所用到的技术有ADC、DMA、TIM、USART。有些可以没有必要使用,但为了作为前一段时间的总结,所以把这几种都给使用上了。说一下做这个的思路,之前每一块都已经学习过,并且都已经实现了,所以想着做这个小项目来练练手。在这里面ADC和DMA读取摇杆的位置,TIM用来输出PWM控制LED的亮度,USART串口用来输出打印一些运行时的信息。如下图所示:
系统实现
项目的文件结构图:
看一下项目的主要代码吧!
项目的所有源代码:https://github.com/Dynamicwang/Control-light.git
下面主要来看一下主函数(main.c):
#include "usart.h"
#include "TIM.h"
#include "adc.h"
u8 Input_Value = 0;
extern uint16_t Conver_Value[10];
int i;
float temp;
void Init(void)
{
USART1_Config();
TIM3_Config(1000);
ADC1_Config();
}
int main(void)
{
Init();
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(1)
{
temp = 0;
for(i = 0;i < 10;i++)
{
temp += Conver_Value[i];
}
temp = temp * 3.3 /40960 *1000;
TIM3_Config((int)(temp/3300 * 1000));
}
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
{
USART_ClearFlag(USART1,USART_FLAG_RXNE);
Input_Value = USART_ReceiveData(USART1);
}
}
在主函数中,我们首先初始化各个文件中的配置,然后ADC软件触发,主函数进入死循环,轮询操作。首先我们将ADC采集的十次摇杆的值进行求和。求完和后对该数值进行转换。最后将计算的值归一化到0-1000范围内,最后一步配置TIM输出的PWM的高电平持续时间。