概要:
この記事では、PWM出力波形を使用してIOポートを制御し、呼吸光を実現し、DAC出力を介して2KHzの正弦波を使用してオーディオ出力機能を編集します。
記事のディレクトリ
1.PWM演習
1.PWMの概要
PWMはパルス幅変調の略で、中国の手段は、パルス幅変調と呼ばれるパルス幅変調。マイクロプロセッサのデジタル出力を利用してアナログ回路を制御する非常に効果的な技術であり、シンプルな制御、柔軟性、優れた動的応答という利点が、パワーエレクトロニクスで最も広く使用されている制御方法になっています。
概略図は次のとおりです。
基本タイマーTIM6およびTIM7に加えてSTM32F1は、他のタイマーがPWM出力を生成できます。高度なタイマーTIM1とTIM8は、同時に最大7つのPWM出力を生成できます。汎用タイマーは、タイマー割り込みの章で紹介されている最大4つのPWM出力を同時に生成することもできます。PWM出力は、実際にはパルス幅が調整可能な方形波信号(つまり、デューティサイクル調整)です。信号周波数は自動リロードレジスタARRの値によって決定され、デューティサイクルは比較レジスタの値によって決定されます。 CCR。合計8つのPWM出力比較モードがあり、CCMRxレジスタのビットOCxM [2:0]によって特別に構成されます。ここでは、最も一般的に使用される2つのPWM出力モードであるPWM1とPWM2についてのみ説明します。その他のモードについては、「STM32F10x中国語リファレンスマニュアル」の第13、14、15章のタイマーを参照してください。
詳細については、stm32PWM出力実験を参照してください。
2.PWM出力構成
1)イネーブルポートクロックを設定し、ピンマルチプレクサマッピングを設定します
2)自動リロード値、周波数分割係数、カウント方法などを含むタイマーパラメータを初期化します。
出力極性、イネーブルなどを含むPWM出力パラメータを初期化します。
3)タイマーを開始します
4)次に、メイン機能でデューティサイクルを制御します。
このとき、while(1)のループコードは、led0pwmvalのデューティサイクルが徐々に増加する、つまり、ますます明るくなる効果があります。に
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
3.メインコード
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
LED1=!LED1;
}
}
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
4.デモンストレーション効果
a。アナログオシロスコープディスプレイ
次のように魔法の杖-Debug-configurationを選択します
オシロスコープの構成は次のとおりです。
表示効果:
b。オシロスコープの表示
c。物理的効果
2.DACの実践
1.DACの概要
- DACはデジタル/アナログ変換モジュールであるため、その名前が示すように、その機能は入力デジタルコードを対応するアナログ電圧出力に変換することです。その機能はADCの機能と反対です。一般的なデジタル信号システムでは、ほとんどのセンサー信号が電圧信号に変換され、ADCは電圧アナログ信号をコンピューターで保存および処理しやすいデジタルコードに変換します。コンピューターが処理された後、DACは電圧アナログ信号アナログ信号は、特定のアクチュエーターを駆動するためによく使用され、人間が簡単に認識できるようにします。たとえば、オーディオ信号の収集と復元はそのようなプロセスです。
- STM32にはオンチップDACペリフェラルがあり、その解像度は8ビットまたは12ビットのデジタル入力信号として構成できます。2つのDAC出力チャネルがあります。これら2つのチャネルは相互に影響しません。各チャネルはDMA機能を使用できます。 。エラー検出機能は外部からトリガーできます。
- DACモジュール図は次のとおりです。
DACモジュール全体は、ブロック図の下部にある**「デジタル-アナログコンバータx」**を中心に展開されています。左側には、基準電源ピン(VDDA、VSSA、およびVref +)があります。STM32DACは、基準電圧Vref +を指定します。入力範囲は2.4〜3.3Vです。「デジタル-アナログコンバーターx」の入力は、DACのデータレジスタ「DORx」のデジタルコードであり、それによって変換されたアナログ信号は、図の右側の「DACOUTX」によって出力されます。データレジスタ「DORx」は「制御ロジック」によっても制御されます。このロジックは、データレジスタを制御して、疑似ノイズ信号を追加したり、三角波信号を生成するように構成したりできます。図の左上隅がDACのトリガーソースです。DACはトリガーソースの信号に応じてDAC変換を実行します。その機能はDACコンバーターのスイッチと同等です。構成可能なトリガーソースは外部です。割り込みソーストリガー、タイマートリガー、またはソフトウェア制御トリガー。この章の実験で正弦波の周波数を制御する必要がある場合は、DACをトリガーしてデータ変換を実行するためのタイマーが必要です。
2.要点を分析し、2KHzの正弦波の出力を実現します
-
DAC_Triggerは、DACトリガーモードを構成するために使用されます
-
DAC_WaveGenerationは、出力ノイズまたは三角波のどちらを開始するかです
-
DAC_LFSRUnmask_TriangleAmpliudeは、ローパスフィルターまたはノイズジェネレーターの三角波の振幅を選択します
-
DAC_OutputBufferは、出力バッファを有効にするかどうかを選択します
その他の手順については、を参照してください。
《【野火®】零死角玩转STM32—F103-MINI》
式によると:
次のように設定します
これは出力します2Khz正弦波
結果は次のとおりです。
ブザーを接続すると、シングルトーンが聞こえます。
4.出力オーディオ信号を設計します
アルゴリズムのロジックは、正弦波信号を出力するという考え方に似ていますが、違いは、サンプリングされた値を変更することです。
ステップ1:Adobe Audition
お気に入りの音楽をオンにして、次のように設定します。
- サンプリングレート8000
- 単核症
- 16位
- 約2〜3秒コレクション
ステップ2:.wavファイルとして保存
.wavファイルはソフトウェアでUedit32
開かれます
ステップ3:フォーマット変換
すべてのコンテンツを選択し、右クリック-選択したビューを16進数でコピーし、メモ帳にコピーします-貼り付けます-右クリック-範囲を選択します
ステップ4:記入のためにnotepad ++にコピーします
notepad++
上記の使用法については、
列ブロックで挿入0x
し、,
各列のリピート動作
ステップ5:アレイを変更する
ステップ6:バーンインして波形を観察します
3.まとめ
この実験では、DACとPWMを理解しようとしました。これら2つのモジュールはタイミングで広く使用されています。たとえば、一部の競技会では、PWM波を使用してステアリングギアとクリックを制御し、ADCとDACを使用して情報を収集できます。たくさん稼ぐ
参照
[1] STM32を使用して、音楽を鳴らして再生するパッシブブザーを制御します(STM32_07)
[2] Stm32PMW出力実験