自己写了一个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
一周热门 更多>