打印
[STM32F1]

利用stm32输出可调的PFM波,但ADC不起作用!!

[复制链接]
1373|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
476754698|  楼主 | 2015-3-21 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚学STM32,想用stm32输出可调的PFM波,通过一个可调电阻来调节PFM波,但ADC不起作用,无论怎么调都还是输出300KHz的PFM波,下面是程序,请大侠们指教。

int main(void)
{
        u32 ad1=0;
        u32 ad2=0;

        RCC_Configuration();                        
    GPIO_Configuration();
        ADC_Configuration();                        
    Tim1_Configuration();

        while(1)
        {
                ad1=ADC_GetConversionValue(ADC1);
                ad2=ad1*3.3/4095;
       
                if(ad2>3)
                {
                         TIM_SetAutoreload(TIM1,119);
                         TIM_SetCompare1(TIM1,60);        //设定占空比
                }
                if((ad2>=2.5)&&(ad2<=3))
                {
                         TIM_SetAutoreload(TIM1,99);
                         TIM_SetCompare1(TIM1,50);        //设定占空比
                }               
                if((ad2>=2)&&(ad2<=2.5))
                {
                         TIM_SetAutoreload(TIM1,79);
                         TIM_SetCompare1(TIM1,40);        //设定占空比
                }               
                if((ad2>=1.5)&&(ad2<=2))
                {
                         TIM_SetAutoreload(TIM1,59);
                         TIM_SetCompare1(TIM1,30);        //设定占空比
                }
                if(ad2<1.5)
                {
                         TIM_SetAutoreload(TIM1,39);
                         TIM_SetCompare1(TIM1,20);        //设定占空比
                }
       
        }
}       
void GPIO_Configuration(void)        //端口初始程序,可初始化多组管脚,串口要用到PA9、10做输入输出
{
        /*输出管脚初始化*/
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;        //
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        /*初始化相应的GPIO*/
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

//        输入管脚初始化       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;               
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
//        初始化相应的GPIO
        GPIO_Init(GPIOB, &GPIO_InitStructure);       

        //ADC输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOC, &GPIO_InitStructure);       

}
void RCC_Configuration(void)        //时钟初始程序
{    SystemInit();        //系统时钟频率72MHz            /*打开GPIOX使用的GPIO的时钟使能*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);        
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频为12M}

void Tim1_Configuration(void)
{                TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;    //第三步,定时器基本配置
TIM_TimeBaseStructure.TIM_Period=150-1;             // 自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler=6-1;            // 时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;    // 采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);        //第四步pwm输出配置
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;                    //设置为pwm1输出模式
TIM_OCInitStructure.TIM_Pulse=75;                                  TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;                 //设置输出极性        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //使能该通道输出        //下面几个参数是高级定时器才会用到,通用定时器不用配置        TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;        //设置互补端输出极性
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//使能互补端输出
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;        //死区后输出状态
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//死区后互补端输出状态
TIM_OC1Init(TIM1,&TIM_OCInitStructure);                                            //按照指定参数初始化        //第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置        TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//运行模式下输出选择
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;         //锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 42;                                         //死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;                 //刹车功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;//刹车输入极性
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//自动输出使能
TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);        //第六步,使能端的打开
TIM_Cmd(TIM1,ENABLE);                                                           //打开TIM2  
TIM_CtrlPWMOutputs(TIM1, ENABLE);                                   //pwm输出使能,一定要记得打开}

void ADC_Configuration(void) //配置数模转换
{        ADC_InitTypeDef ADC_InitStructure;
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; //转换通道数量
ADC_Init(ADC1, &ADC_InitStructure);                  //定义规则组
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1, ENABLE);//ADC使能                ADC_ResetCalibration(ADC1);         //ADC复位
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);        //ADC校准
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//启动ADC}       


沙发
476754698|  楼主 | 2015-3-21 22:49 | 只看该作者
自己顶一个!!

使用特权

评论回复
板凳
mmuuss586| | 2015-3-23 12:15 | 只看该作者

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/


#define ADC1_DR_ADDRESS     ((uint32_t)0x4001204C)

__IO uint16_t ADCConvertedValue=0;
void Adc12_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable DMA1 clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2, ENABLE);
       
          /* Configure and enable ADC interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
  /* Configure PA.01 (ADC Channe1) as analog input -------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
          /* DMA1 channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 1;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel14 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);
  
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));
     
  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
       
          /* ADC2 configuration ------------------------------------------------------*/
  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;
  ADC_Init(ADC2, &ADC_InitStructure);
  /* ADC2 regular channels configuration */
  ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
  /* Enable ADC2 EOC interrupt */
  ADC_ITConfig(ADC2, ADC_IT_EOC, ENABLE);
       
          /* Enable ADC2 */
  ADC_Cmd(ADC2, ENABLE);

  /* Enable ADC2 reset calibration register */   
  ADC_ResetCalibration(ADC2);
  /* Check the end of ADC2 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC2));

  /* Start ADC2 calibration */
  ADC_StartCalibration(ADC2);
  /* Check the end of ADC2 calibration */
  while(ADC_GetCalibrationStatus(ADC2));
        /* Start ADC2 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC2, ENABLE);
}

使用特权

评论回复
地板
mmuuss586| | 2015-3-23 12:16 | 只看该作者
我的ADC初始化,仅供参考;

使用特权

评论回复
5
476754698|  楼主 | 2015-4-1 09:40 | 只看该作者
mmuuss586 发表于 2015-3-23 12:16
我的ADC初始化,仅供参考;

非常感谢,我先试一下。

使用特权

评论回复
6
mmuuss586| | 2015-4-1 12:28 | 只看该作者
476754698 发表于 2015-4-1 09:40
非常感谢,我先试一下。

不客气

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝