(NANO)PWM输出一个0到3.3V可调电压,用按键调节,怎么才能做到按键稳定。

2019-07-21 05:41发布

这是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之后,数码管会不断闪烁)




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
peng1554
1楼-- · 2019-07-21 08:36
 精彩回答 2  元偷偷看……
940844841
2楼-- · 2019-07-21 11:19
peng1554 发表于 2019-1-19 19:37
19是指ARR寄存器的值,ARR寄存器的左右可以看板子的开发文档~~
20就帮顶了

谢谢啦,20听大神说好像是ADC取20次平均值。

一周热门 更多>