LoginSignup
0
0

More than 1 year has passed since last update.

STM32L010でPWMの測定を作てみた。

Last updated at Posted at 2021-07-18

x mbed2のリビジョン143

目的
シェフの気まぐれ
内部タイマーを使いusでオン時間を測る
シリアル出力

結果

pwm_hz_82ms_1.jpg

忙しい人よう

o_con63.jpg

あんまり意味がないが 高速化と高精度化


#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//1000の割り算 だいたい正しい
#define DVI1000(n) ((n>>10)+(((n>>10)*32)>>10))

#define HIGH 1
DigitalIn in1(PA_1);

DigitalOut led1(PA_4); //debug

RawSerial pc(PA_2, PA_3); //010 tx, rx

//タイマーの設定
Timer t;

//in1のオン時間をusで測る 今のところ引数は、無効
int pulseIn(int pin1,int pu1,int timeout1)
{
    t.reset();

    //while(in1 != 0) {}

    loop_ins:
    //                      1234567890123456
    if (   (GPIOA->IDR) & 0b0000000000000010   ) { goto loop_ins;}

    //while(in1 == 0) {}

    loop_s1:
    //                            1234567890123456
    if (     (~(GPIOA->IDR))  & 0b0000000000000010    ) { goto loop_s1;}

    //led1 = 1;//debug

    int sd = t.read_us();


    //while(in1 != 0) {}

    loop_in1:
    //                      1234567890123456
    if (   (GPIOA->IDR) & 0b0000000000000010   ) { goto loop_in1;}

    //led1 = 0;//debug

    return(t.read_us()-sd);

}//pulseIn

int main() {

    t.start(); //pulseInで必要

    int pwmco2; //onの間隔 us

    //無限ループ
    while(1){

        //PWMでデータ取得
        pwmco2=pulseIn(7 ,HIGH,2000000);
        //pwmco2=82000; //debug
        printf("The time taken was %d seconds\r\n", pwmco2  );
        printf("The time taken was %d seconds\r\n", DVI1000(pwmco2)  );

        //0.1秒待つ
        wait_ms(100);

    }//while

}//main



テストプログラム



#include "mbed.h"

//周波数の設定 400ppm = 5000×(82ms-2ms)/1000ms
#define XHZ_A (1004*1000)
#define XHZ_B ((80+2)*1000)

//PWMのピンの設定
PwmOut servo(A4); //PA_5   //010

//debug
DigitalOut myled(PA_4);

int main() {

    //周期の設定        
    servo.period_us(XHZ_A);

    //間隔の設定
    servo.pulsewidth_us(XHZ_B);

    while(1) {

        myled = 1;  
        //250ミリ秒まつ
        wait_ms(250);   

        myled = 0;  
        //200ミリ秒まつ
        wait_ms(250);

    }//while


}//main

//容量削減
void error(const char* format, ...){}




改良まえ


#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//1000の割り算 だいたい正しい
#define DVI1000(n) ((n>>10)+(((n>>10)*32)>>10))

#define HIGH 1
DigitalIn in1(PA_0);

DigitalOut led1(PA_4); //debug

RawSerial pc(PA_2, PA_3); //010 tx, rx

//タイマーの設定
Timer t;

//in1のオン時間をusで測る 今のところ引数は、無効
int pulseIn(int pin1,int pu1,int timeout1)
{

    while(in1 == 0) {}

    led1 = 1;//debug

    t.start();
    t.reset();
    while(in1 != 0) {}
    t.stop();

    led1 = 0;//debug

    return(t.read_us());

}//pulseIn

int main() {

    int pwmco2;

    while(1){

        //PWMでデータ取得
        pwmco2=pulseIn(7 ,HIGH,2000000);
        printf("The time taken was %d seconds\r\n", pwmco2  );
        printf("The time taken was %d seconds\r\n", DVI1000(pwmco2)  );

        //0.1秒待つ
        wait_ms(100);

    }//while

}//main



o_con63.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0