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

利用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,但无论怎么调都没有反应。
wambob 回答时间: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有很多不懂得地方,恳请大家指教!!!
wambob 回答时间:2015-3-22 18:41:43
用串口啊
zfz0122 回答时间: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

支持学习
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版