你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
jasonyeh 提问时间:2015-3-22 09:43 /
本人刚学STM32,想用stm32输出可调的PFM波,通过一个可调电阻来调节PFM波,但ADC不起作用,无论怎么调都还是输出300KHz的PFM波,即ADC为0,下面是程序,请大侠们指教。

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}        
收藏 评论10 发布时间:2015-3-22 09:43

举报

10个回答
nocoyou 回答时间:2015-3-22 09:57:16
输出不是DAC么,ADC是输入的呀。。
_ilikerome_ 回答时间:2015-3-22 10:02:37
太长了,顶一下吧。。。
jasonyeh 回答时间:2015-3-22 11:41:10
nocoyou 发表于 2015-3-22 09:57
输出不是DAC么,ADC是输入的呀。。

是用ADC输入,我用一个可调电阻个给相应的引脚输入电压信号来控制PFM,但无论怎么调都没有反应。
wamcncn 回答时间:2015-3-22 12:36:40
PFM ?PWM吧,首先调试下ADC采集的结果保存在那个变量里,值正确吗,用这个值去控制TIM比较输出。
你的问题是程序没写对
jasonyeh 回答时间:2015-3-22 15:06:29
wambob 发表于 2015-3-22 12:36
PFM ?PWM吧,首先调试下ADC采集的结果保存在那个变量里,值正确吗,用这个值去控制TIM比较输出。
你的问题 ...

你好,想请教一下,用什么方法来调试ADC采集结果,我程序中是什么地方出现问题,由于刚接触STM32有很多不懂得地方,恳请大家指教!!!
wamcncn 回答时间:2015-3-22 18:41:43
用串口啊
kqh1120 回答时间:2015-3-23 00:44:22
PFM波是什么 3.gif
废鱼 回答时间:2015-3-23 08:58:49
要先设置AD采集通道、开启AD时钟、通过单独或者连续采集的方法,采集到数据放入到一个缓冲区中,达到缓冲区满以后,输出AD数据,并清空缓冲区重新开始采集。
saddyxia 回答时间:2015-3-23 14:03:32

支持学习
stary666 回答时间:2015-3-23 15:36:34
学习一下!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版