pwm-ADC实验

2019-07-20 09:52发布



自己写了一个PWM和ADC结合的代码实现5v的电压输出,ADC进行电压采样,根据采样的电压值来调节PWM的占空比,在主函数写的一串代码,发现电压不断闭环并不能实现5v电压稳定,代码如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "adc.h"
#include "lcd.h"

//ALIENTEK 探索者STM32F407开发板 实验9
//PWM输出实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK

int main(void)
{
        u16 adcx;
        float temp;
        u16 compare;
        u16 led0pwmval=0;   
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);  //初始化延时函数
        uart_init(115200);//初始化串口波特率为115200
        TIM14_PWM_Init(1000-1,84-1);        //84M/84=1Mhz的计数频率,重装载值1000,所以PWM频率为 1M/1000=1Khz.
        Adc_Init();         //初始化ADC
        LCD_Init();         //初始化LCD接口
        POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
        LCD_ShowString(30,130,200,16,16,"ADC1_CH5_VAL:");             
        LCD_ShowString(30,150,200,16,16,"ADC1_CH5_VOL:0.000V");        //先在固定位置显示小数点  
       
       
   while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
        {
               
               
                adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均
                LCD_ShowxNum(134,130,adcx,4,16,0);    //显示ADCC采样后的原始值
                temp=(float)adcx*(3.3/4096)*2.7;          //获取计算后的带小数的实际电压值,比如3.1111
                adcx=temp;                            //赋值整数部分给adcx变量,因为adcx为u16整形
                LCD_ShowxNum(134,150,adcx,1,16,0);    //显示电压值的整数部分,3.1111的话,这里就是显示3
                temp-=adcx;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
                temp*=1000;                           //小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。
                LCD_ShowxNum(150,150,temp,3,16,0X80); //显示小数部分(前面转换为了整形显示),这里显示的就是111.
                LED0=!LED0;
                delay_ms(250);       
               
               
               
                //delay_ms(10);
               
                compare=(adcx-5.000)*1000;//               
                if(compare>900)led0pwmval--;LED1=0;//绝对值 led0pwmval递减
                else(compare>0.0&&compare<500.0)led0pwmval=led0pwmval;
                //else if(compare<0.0)led0pwmval++;
                TIM_SetCompare1(TIM14,led0pwmval);        //修改比较值,修改占空比
        }
}
{MOD}地址:https://pan.baidu.com/s/1pNbtiv5
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。