STM32L010でPWMの測定を作てみた。
x mbed2のリビジョン143
目的
シェフの気まぐれ
内部タイマーを使いusでオン時間を測る
シリアル出力
結果
忙しい人よう
あんまり意味がないが 高速化と高精度化
#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
Author And Source
この問題について(STM32L010でPWMの測定を作てみた。), 我々は、より多くの情報をここで見つけました https://qiita.com/caa45040/items/99dfbaec4d3f0b8b7bac著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .