标题: STM32 ADC控制电位计同步改变灯的亮度 [打印本页]

作者: 小七仔    时间: 2017-12-25 18:21
标题: STM32 ADC控制电位计同步改变灯的亮度
ADC__控制电位计同步改变灯的亮度



1. 开启ADC时钟和GPIO配置(模拟输入模式)
2. 中断的配置
3. PWM的配置
4. ADC配置
void adc_config()
{
    ADC_InitTypeDef ADC_InitStructure;
    ADC_DeInit(ADC1);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);                   //RCC时钟配置为72Mhz,分频为12Mhz
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描转换关闭
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换模式
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不用外部事件启动转换
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐为右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;//规则通道序列长度为1
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);
   
   
    ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
   
    ADC_Cmd(ADC1, ENABLE);
    //复位指定的ADC1的校准寄存器
    ADC_ResetCalibration(ADC1);
    //获取ADC1复位校准寄存器的状态,设置状态则等待
    while(ADC_GetResetCalibrationStatus(ADC1))
    {
    }
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1))
    {
    }
    //配置ADC模块需注意的是需要配置adc的启动方式,这里配置为软件启动
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);        
   
}
5. ADC中断函数编写,把ADC得到的值转换设置给PWM的占空比,改变LED亮度
void ADC1_2_IRQHandler(void)
{
    u16 ADCConvertedValue;
        if(ADC_GetITStatus(ADC1,ADC_IT_EOC)!=RESET)//获取ADC中断状态
        {
            ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);//清楚中断位
            ADCConvertedValue = ADC_GetConversionValue(ADC1);//取得ADC1扫描通道得到的值
            TIM_SetCompare4(TIM2,ADCConvertedValue*4096/0xfff);//重新设置PWM的比较捕获值,即TIM_Pulse得值
        }

}
6.将PWM的引脚(我的是PA3)和LED0的PF6连起来,通过旋钮即可控制LED0亮度


作者: 通信122    时间: 2019-7-24 18:17
ADC中断函数编写可以写在那些地方呢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1