极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32285|回复: 4

8F328P-U 的最大開關頻率

[复制链接]
发表于 2018-6-26 17:15:13 | 显示全部楼层 |阅读模式
測試程序:
  1. void setup() {
  2.   pinMode(9, OUTPUT);

  3. }

  4. void loop() {
  5.   digitalWrite(9, HIGH);
  6.   digitalWrite(9, LOW);
  7. }
复制代码


結果: ~ 39.5kHz

結論:這與Arduino Nano 的 ~124kHz 有很大的差別
回复

使用道具 举报

 楼主| 发表于 2018-6-26 17:35:01 | 显示全部楼层
本帖最后由 eddiewwm 于 2020-3-3 11:28 编辑

詳細檢查後,發現是忘了把板型從 Arduino Nano 轉至 LGT8F328P。

改正後,結果為 ~239kHz。


  1. void setup()
  2. {
  3.   sysClock(INT_OSC); //use internal 32MHz RC clock
  4.   CLKPR = 0x80;
  5.   //  CLKPR = 0x00;   //Divider=1, =>32MHz/1 = 32MHz
  6.   CLKPR = 0x01;   //Divider=2, =>32MHz/2 = 16MHz

  7.   Serial.begin(9600);

  8.   pinMode(9, OUTPUT);
  9.   pinMode(10, INPUT);

  10.   Serial.println("Speed Test will begin momentarily.");
  11.   Serial.println("");

  12.   delay(4000);

  13.   speedTest();
  14. }

  15. void loop()
  16. {
  17.   // Do nothing
  18. }

  19. void speedTest(void)
  20. {
  21.   register int i, j;
  22.   volatile unsigned char c1, c2;
  23.   volatile int v;
  24.   volatile long l1, l2;
  25.   volatile float f1, f2;
  26.   int p, q;
  27.   long int r;
  28.   unsigned long m, n;
  29.   float d, overhead;
  30.   char buffer[30];

  31.   Serial.println(F(""));
  32.   Serial.println(F("Speed test"));
  33.   Serial.println(F("----------"));

  34.   Serial.print(F("F_CPU = "));
  35.   Serial.print(F_CPU, DEC);
  36.   Serial.println(F(" Hz"));
  37.   Serial.print(F("1/F_CPU = "));
  38.   Serial.print((1000000.0 / (float)F_CPU), 4);
  39.   Serial.println(F(" us"));

  40.   delay(800);    // Allow the Serial text to be transmitted

  41. for (int outPin=2; outPin<20; outPin++){
  42.   pinMode(outPin, OUTPUT);  
  43. }

  44.   for (int k = 2; k < 20; k++) {
  45.     Serial.print(F("  digitalWrite "));
  46.     Serial.print(k);
  47.     Serial.print(F("  :\t"));
  48.     delay(70);     // Allow the Serial text to be transmitted
  49.     m = millis();
  50.     for (i = 0; i < 2; i++)
  51.     {
  52.       for (j = 0; j < 10000; j++)
  53.       {
  54.         digitalWrite(k, HIGH);
  55.         digitalWrite(k, LOW);

  56.         digitalWrite(k, HIGH);
  57.         digitalWrite(k, LOW);

  58.         digitalWrite(k, HIGH);
  59.         digitalWrite(k, LOW);

  60.         digitalWrite(k, HIGH);
  61.         digitalWrite(k, LOW);

  62.         digitalWrite(k, HIGH);
  63.         digitalWrite(k, LOW);

  64.         digitalWrite(k, HIGH);
  65.         digitalWrite(k, LOW);

  66.         digitalWrite(k, HIGH);
  67.         digitalWrite(k, LOW);

  68.         digitalWrite(k, HIGH);
  69.         digitalWrite(k, LOW);

  70.         digitalWrite(k, HIGH);
  71.         digitalWrite(k, LOW);

  72.         digitalWrite(k, HIGH);
  73.         digitalWrite(k, LOW);
  74.       }
  75.     }
  76.     n = millis();
  77.     d = ((float)n - (float)m) / ((float)i * (float)j);
  78.     d *= 1000.0;
  79. //    d -= overhead;
  80.     d -= 4; //overhead 32MHz = 2, 16MHz = 4
  81.     d /= 20.0;
  82.     Serial.print (d, 3);
  83.     Serial.print (F("\t us,\t Max Frequency :\t"));
  84.     Serial.print (500/d, 3);
  85.     Serial.println (F("\t kHz"));
  86.   }
  87. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2019-2-23 15:42:44 | 显示全部楼层
大神级别,看了您很多帖子。
回复 支持 反对

使用道具 举报

发表于 2021-2-17 22:50:37 | 显示全部楼层
我之前测试过GPIO最大翻转频率可以达到8MHz
回复 支持 反对

使用道具 举报

发表于 2021-6-1 10:33:45 | 显示全部楼层
我用下边的程序测试了,发现改变CLKPR的设置对运行速度没有影响,请问楼主可能是什么问题?程序用数码管显示管脚电平10000次跳变所用时间

#include "TM1637.h"
#define CLK 2//pins definitions for TM1637 and can be changed to other ports      
#define DIO 4
TM1637 tm1637(CLK,DIO);
  
void setup() {
  sysClock(INT_OSC); //use internal 32MHz RC clock
  CLKPR = 0x80;      
  //CLKPR = 0x00;      //Divider=1,=>32MHz/1=32MHz
  CLKPR = 0x01;      //Divider=2,=>32MHz/2=16MHz
  //CLKPR = 0x02;      //Divider=4,=>32MHz/2=8MHz
  //CLKPR = 0x03;      //Divider=8,=>32MHz/2=4MHz
  //CLKPR = 0x04;      //Divider=16,=>32MHz/2=2MHz
  //CLKPR = 0x05;      //Divider=32,=>32MHz/2=1MHz
  //CLKPR = 0x06;      //Divider=64,=>32MHz/2=0.5MHz
  //CLKPR = 0x07;      //Divider=128,=>32MHz/2=0.25MHz
  //CLKPR = 0x08;      //Divider=256,=>32MHz/2=0.125MHz
   Serial.begin(9600);
}

void loop() {
  int i,j,k,l;
  long t0;

      for(j=5;j<14;j++){
       pinMode(j,OUTPUT);
       tm1637.init();
       tm1637.set(0);          //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
      
       for(l=0;l<5;l++){
       t0=millis();
       for(i=0;i<10000;i++){
         digitalWrite(j,HIGH);
         digitalWrite(j,LOW);  
       }
       t0=millis()-t0;
       displaynumber(j);
       delay(4000);
       Serial.println(t0);
       displaynumber(t0);
       delay(2000);
       }
    }
}
void displaynumber(long n)
{
  int i,j;
  long k;
  boolean f=false;
  tm1637.init();
  k=n;
  for(i=3;i>-1;i--)
  {
    j=k/pow(10,i);
    if(j>0) f=true;
    if(f) tm1637.display(3-i,j);
    k=k-j*pow(10,i);
  }
  if(f==false) tm1637.display(3,j);
}  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 06:06 , Processed in 0.056394 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表