这是main
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "key.h"
#include "beep.h"
#include "adc.h"
#include "smg.h"
#include "timer.h"
/************************************************
ALIENTEK NANO板STM32F103开发板 实验9
PWM输出实验-HAL库版本
技术支持:
www.openedv.com
淘宝店铺:
http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
// 共阴数字数组
// 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, .,全灭
u8 smg_num[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x01,0x00};
int main(void)
{
vu8 key=0;
u16 led6pwmval=0;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
delay_init(72); //初始化延时函数
uart_init(9600); //初始化串口
LED_Init(); //初始化与LED连接的硬件接口
LED_SMG_Init(); //数码管初始化
Adc_Init(); //ADC初始化
TIM3_PWM_Init(19,7199); //数码管2ms定时显示
KEY_Init(); //初始化按键
BEEP_Init(); //初始化BEEP
while(1)
{
key=KEY_Scan(0);//得到键值
switch(key)
{
case KEY0_PRES://KEY0
if(led6pwmval<198)
led6pwmval=led6pwmval+2;
TIM_SetTIM3Compare1(led6pwmval);//修改比较值,修改占空比
printf("%d
",led6pwmval);
break;
case KEY1_PRES://KEY1
if(led6pwmval>0)
led6pwmval=led6pwmval-2;
TIM_SetTIM3Compare1(led6pwmval);//修改比较值,修改占空比
printf("%d
",led6pwmval);
break;
default:
delay_ms(5);
}
TIM_SetTIM3Compare1(led6pwmval);//修改比较值,修改占空比
}
}
//ADC变量你
static u16 adcx=0;
static u16 adcx1=0;
static float temp=0;
u8 num=0;//数码管值
u8 smg_wei=0;//数码管位选
u8 adc_t=0;//adc采样时间值
u8 led_t=0;//led显示时间值
//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
adc_t++;
if(adc_t==100)//ADC 200ms采样
{
adc_t=0;
adcx=Get_Adc_Average(ADC_CHANNEL_9,20);//ADC原始值
temp=(float)adcx*(3.3/4096);//ADC电压值
adcx1=temp;
temp-=adcx1;
temp*=1000;
}
switch(smg_wei)
{
//ADC采样值
case 0:
if(adcx>1000)num = smg_num[adcx/1000];
else num = 0x00;
break;
case 1:
if(adcx>100) num = smg_num[adcx%1000/100];
else num = 0x00;
break;
case 2:
if(adcx>10) num = smg_num[adcx%100/10];
else num = 0x00;
break;
case 3:
num = smg_num[adcx%10];
break;
case 4: num = 0x00; break;
//ADC换算后的电压值
case 5: num = smg_num[adcx1]|0x01;break;
case 6: num = smg_num[(u16)temp/100]; break;
case 7: num = smg_num[(u16)temp%100/10];break;
}
LED_Write_Data(num,smg_wei);//写数据到数码管
LED_Refresh();//更新显示
smg_wei++;
if(smg_wei==8) smg_wei=0;
led_t++;
if(led_t==250)//500ms闪烁
{
led_t=0;
LED0=!LED0;
}
}
}
请问这两句函数分别是什么意思?
TIM3_PWM_Init(
19,7199); //数码管2ms定时显示 (调节主频之后,我的按键会不稳定)
adcx=Get_Adc_Average(ADC_CHANNEL_9,
20);//ADC原始值 (调节通道9后面的数值,大于20之后,数码管会不断闪烁)
谢谢啦,20听大神说好像是ADC取20次平均值。
一周热门 更多>