STM32检查光敏电阻的变化控制灯的亮暗(ADC采集,PWM输出)

内容主要是——1、对光敏电阻经行ADC的采集;2、采集的数据用作PWM控制小灯的明暗变化。
第一部分:
1.1对光敏电阻的使用基本了解:
光敏电阻内部就是一个PN结,光的强弱会引起其导通的变化,从而会引起电流的变化;电路设计方面,主要是利用电流的变化,然后在串联一个电阻,就可以转换成电压的变化,然后在利用ADC来采集电压的变化进行处理。同时光线与电压值成反比。
1.2ADC采集:
1,电路上选择某个ADC和使用相应的通道选择。
2、ADC的使用步骤:
第一步:开启相关ADC的时钟,设置分频因子。<ADC_CCR寄存器>
第二步:ADC的工作模式设置(主要是:转换模式、触发方式、数据对齐等)
<ADCx_CR1,ACDx_CR2>
第三步:ADC规则序列通道设置(设置规则序列中的通道数、和通道的采样周期。)
<ADCx_SQR,ADCx_SMPR>
第四步:开启AD转换器。<ADC_CRx寄存器>
///以上是基本初始化设置。
第五步:读取ADC的值。<ADC_DR寄存器的值>
具体过程是:1,转换序列设置,(选择相应的规则序列,并添加要开启的通道。);2,通过ADCx_CR来启动规则转换通道。;3,通过ADCx_SR状态标志位,循环等待转换完成。;4,直接还回ADCx_DR数据寄存器即可。
/注意:
1、stm32f4的adc最高36M,一般分频因子设置为4,APB2时钟为84M,所以adc的时钟为21M。
//
第一部分:pwm控制输出
1.1pwm初始化
//初始化设置
/*
1,时钟使能:io使能和定时器使能
2,配置gpio位推挽复用输出,上拉,100M
3,引脚功能复用

4,填充arr和psc
TIMX->ARR=arr;
TIMX->PSC=psc;
5,TIMX_CCMR控制
pwm模式选择
预装值使能
6,使能
6.1 TIMX->CCER
设置有效电平方式
使能输出
6.2TIMX->CR1
自动重装载预装载使能
计数器使能
*/
//
main中,就是主要将采集的光敏值,传给TIMx_CCR1就可以了;
并且可以在主函数做出路灯的效果,当光照强度大于一定值时,灯灭;当光线越暗则灯越亮。

  • 12
    点赞
  • 210
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
首先,你需要将光敏电阻连接到STM32F103C8T6的ADC输入引脚。然后,你需要编写一个ADC采集程序,将光敏电阻的模拟信号转换为数字信号。接着,你需要编写一个控制LED灭的程序,通过判断采集到的光敏电阻的值来控制LED的灭。 以下是一个简单的示例程序: ```c #include "stm32f10x.h" #define LED_PIN GPIO_Pin_13 #define LED_PORT GPIOC void ADC_Configuration(void); void LED_Configuration(void); void delay(uint32_t time); int main(void) { uint16_t adc_value; ADC_Configuration(); LED_Configuration(); while(1) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); adc_value = ADC_GetConversionValue(ADC1); if(adc_value > 1000) { GPIO_SetBits(LED_PORT, LED_PIN); } else { GPIO_ResetBits(LED_PORT, LED_PIN); } delay(100); } } void ADC_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } void LED_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_PORT, &GPIO_InitStructure); } void delay(uint32_t time) { for(uint32_t i = 0; i < time; i++); } ``` 该程序使用PA0引脚接收光敏电阻的模拟信号,使用ADC1模块进行转换。如果采集到的值大于1000,则LED,否则LED灭。程序中使用了一个简单的延时函数,可以根据需要进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值