打印
[应用方案]

N76E003此款芯片的定时器、ADC功能

[复制链接]
488|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eefas|  楼主 | 2023-7-14 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
多通道采集:
Uint32_t Get_ADC_Val(char channels)//获取ADC通道ADC值
{
        uint32_t ADC;
//        CKDIV=0x02;
        switch(channels)
        {
                case 4:
                        Enable_ADC_AIN4;        
               
                        break;

                case 5:
                        Enable_ADC_AIN5;
                        break;
               
                case 6:
                        Enable_ADC_AIN6;
                        break;
               
                case 7:
                        Enable_ADC_AIN7;
                        break;
        }
        clr_ADCF;
        set_ADCS;                                                                        // ADC start trig signal
  while(ADCF == 0);
        ADC=(ADCRH<<4)+ADCRL;
        clr_ADCF;
//        CKDIV=0x00;
        return ADC;        
}

小节总结:ADC的使用相信各位大神已经是使用的滚瓜烂熟了,我这种新手就不多提了,哈哈
附上一篇截图官方文档的ADC使用资料:



定时器模块:官方库中有各个定时器各个模式的sample Code附图:




简单附上定时器0模式1(部分执行代码)的官方代码:
/************************************************************************************************************
*    TIMER 1 interrupt subroutine
************************************************************************************************************/
void Timer1_ISR (void) interrupt 3  //interrupt address is 0x001B
{
    TH1 = u8TH1_Tmp;
    TL1 = u8TL1_Tmp;   

    P03 = ~P03;                     //P0.3 toggle when interrupt
}
/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main (void)
{

    Set_All_GPIO_Quasi_Mode;
                TIMER0_MODE1_ENABLE;
                TIMER1_MODE1_ENABLE;

    clr_T1M;
    //set_T1M;

    u8TH0_Tmp = (65536-TH0_INIT)/256;
    u8TL0_Tmp = (65536-TL0_INIT)%256;   
    u8TH1_Tmp = (65536-TH1_INIT)/256;
    u8TL1_Tmp = (65536-TL1_INIT)%256;

    TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;
    TH1 = u8TH1_Tmp;
    TL1 = u8TL1_Tmp;

    set_ET0;                                    //enable Timer0 interrupt
    set_ET1;                                    //enable Timer1 interrupt
    set_EA;                                     //enable interrupts
    set_TR0;                                    //Timer0 run
    set_TR1;                                    //Timer1 run
    while(1);
}

附上我自己(基于新唐官方库)修改后的使用定时器执行代码:

void Timer0_Init(void)//
{
        //TMOD = 0XFF;
        CKDIV=0X0C;
        TIMER0_MODE1_ENABLE;                   //Timer 0 and Timer 1 mode configuration
//        TIMER1_MODE2_ENABLE;
        clr_T0M;
    u8TH0_Tmp =TIMER_DIV12_VALUE_1ms>>8; //12分频初值
    u8TL0_Tmp =TIMER_DIV12_VALUE_1ms; //
        
          TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;
        set_ET0;                                    //enable Timer0 interrupt
//set_ET1;                                    //enable Timer1 interrupt
        set_EA;                                     //enable interrupts
        set_TR0;                                    //Timer0 run
//set_TR1;                                    //Timer1 run
        CKDIV=0X00;
}

void Timer0_ISR (void) interrupt 1         
{        
          TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;
        
        time_count++;
        key_handle=1;
        
        if(time_count==1000)
        {
                time_count=0;
    miao++;
    if(miao==60)
    {
      miao=0;
      fen++;
      if(fen==60)
      {
        fen=0;
        shi++;
        if(shi==24)
        {
          shi=0;
        }
       }
     }               
        }
        TF0=0;        
}

附上一张官方文档:




小节总结:官方提供的sample CODE 覆盖了整个定时器模块,给新人使用还是很有参考价值的,这次我也是第一次使用新唐的单片机,个人感觉还是挺方便的, N76E003  纯C51风格开发,(但就是定时器的使用让我思考起来人生),下载了官方库下来参考,看工程,咦!代码风格不一般,内设使用起来这么方便(库都已近定义好了),这不是Ctrl+c\Ctrl+v就能解决了吗!
这样新手 用起来就难堪了,我怎么调试定时中断时间都不对,难道是初值算错了,于是又找度娘,看看定时器初值怎么计算。改了改溢出值(还是不对,能力不够或者是解决问题的方向不对)于是又滑动鼠标滚轮看起了规格书(还好新唐的规格书是中文,不然就尴尬了)
规格书介绍的也挺简单的呀,看了看又调试,还是不行。于是又回到了官方库sample Code
附上一张官方库的文件图片:(提供的图片没什么用,就看看)




在官方库中的定时器模块没有找到解决方法。
哎,再仔细看看官方的库

有这么一个源文件:




看到有以下这些像是定时器的延时代码,想会不会是这些。
void Timer0_Delay100us(UINT32 u32CNT)
{
    clr_T0M;                                                //T0M=0, Timer0 Clock = Fsys/12
    TMOD |= 0x01;                                           //Timer0 is 16-bit mode
    set_TR0;                                                //Start Timer0
    while (u32CNT != 0)
    {
        TL0 = LOBYTE(TIMER_DIV12_VALUE_100us);        //Find  define in "Function_define.h" "TIMER VALUE"
        TH0 = HIBYTE(TIMER_DIV12_VALUE_100us);
        while (TF0 != 1);                                   //Check Timer0 Time-Out Flag
        clr_TF0;
        u32CNT --;
    }
    clr_TR0;                                                       //Stop Timer0
}
//------------------------------------------------------------------------------
void Timer0_Delay1ms(UINT32 u32CNT)
{
    clr_T0M;                                                //T0M=0, Timer0 Clock = Fsys/12
    TMOD |= 0x01;                                           //Timer0 is 16-bit mode
    set_TR0;                                                //Start Timer0
    while (u32CNT != 0)
    {
        TL0 = LOBYTE(TIMER_DIV12_VALUE_1ms);                 //Find  define in "Function_define.h" "TIMER VALUE"
        TH0 = HIBYTE(TIMER_DIV12_VALUE_1ms);
        while (TF0 != 1);                                   //Check Timer0 Time-Out Flag
        clr_TF0;
        u32CNT --;
    }
    clr_TR0;                                                //Stop Timer0
}

像延时一样,填上定时器初值看看定时中断对不对,调试又不对

TL0 = Timer0_Delay1ms(1);//1ms定时中断 初值
TH0 = Timer0_Delay1ms(1);
不对,,,,,,,还是不对。

再找找看看怎么解决,(又回到了下面的文件里,定时器初值的定义),填上去试试对不对,还是不对,呀呀呀呀呀。


仔细思考了一会,#define TIMER_DIV12_VALUE_1ms        65536-1334//1334*12/16000000 = 1 mS,                         // Timer divider = 12

这个初值是要对定时器模块进行相关的分频后的初值吗?
于是又看起了官方库,没有相关的定时器分频的使用参考呀,于是再回到了规格书:
找分频的使用介绍看看:附上图片:






看到这些资料,试试对定时器进行时钟分频调调看:于是就又了以下代码:


前面已经贴出,这里贴图片只做经验介绍总结。这里箭头和圈圈的就是我的解决方法了,定时器1ms中断实现了

使用特权

评论回复
沙发
tpgf| | 2024-2-4 08:06 | 只看该作者
有没有实际进行采样看看采样精度咋样啊

使用特权

评论回复
板凳
qcliu| | 2024-2-4 08:44 | 只看该作者
adc采集功能可以有不同的模式  这些模式应该如何进行选用呢

使用特权

评论回复
地板
wiba| | 2024-2-4 09:50 | 只看该作者
这款芯片的定时器能输出pwm波控制电机吗

使用特权

评论回复
5
drer| | 2024-2-4 18:01 | 只看该作者
在adc采集过程中可以实时调整adc的采样频率吗

使用特权

评论回复
6
coshi| | 2024-2-4 18:37 | 只看该作者
应该也有普通定时器以及高级定时器的差别

使用特权

评论回复
7
kxsi| | 2024-2-4 19:11 | 只看该作者
可以考虑附一下adc的初始化代码以作参考

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

2589

帖子

2

粉丝