欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機ADC準換的值作為PWM的占空比!弄很久一直沒有弄出來!
[打印本頁]
作者:
Yusheng哥
時間:
2020-5-5 09:37
標題:
單片機ADC準換的值作為PWM的占空比!弄很久一直沒有弄出來!
求大佬幫看一下,ADC準換的值作為PWM的占空比!弄很久一直沒有弄出來!時鐘用的單片機內部22.1184mhz 身邊沒有示波器!ADC已通過串口調試過了沒有問題!唯獨PWM沒有搞定,還有一個問題想請教一下大佬們,直流電機用PWM調速一般用多大的頻率合適?STC8位PWM如果采用定時器0的溢出值作為PCA的時鐘,那么定時器的初始值該怎么計算,之前參考過好多篇文章,始終沒有解決 源程序已經打包了,所以在這里求一個具體的計算方法 最后謝謝各位大佬了!!
#include <STC8.H>
#include <math.h>
#include <uart.H> // 導入串口庫文件
//#include <PWM.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void adc_init(void);
void delay100ms(void); //誤差 -0.000000000013us
void PWM_init(void);
void PWM_u8init(void);
void PWM_set(uchar PWM);
void InitTimer0(void);
#define uchar unsigned char
#define uint unsigned int
sbit PWM = P1^1;
/******************************************************************
主函數
******************************************************************/
char Data;
void main(void)
{
AUXR = AUXR|0x80; // T0, 1T Mode
InitTimer0();
adc_init(); //ADC 初始化
UartInit(); // Uart 初始化
// PWM_init();
PWM_u8init();
UartSendStr("Uart test\r\t");//Uart 發送測試
while(1)
{
// SBUF = Data;
PWM_set(Data);
// PWM = 1;
// delay100ms();
// PWM = 0;
delay100ms();
}
}
/******************************************************************
ADC啟動函數
******************************************************************/
void adc_init(void)
{
P1M0 = 0x00;
P1M1 = 0x01; //設置P1.0口為高阻輸入
ADC_CONTR = 0x80; // 打開ADC電源 P1.0作為ADC轉換引腳
ADCCFG = 0x0f;
EADC = 1; // 打開ADC 中斷
EA = 1; // 打開總中斷
ADC_CONTR |= 0x40;//啟動ADC轉換
}
/******************************************************************
ADC中斷函數
******************************************************************/
void adc_zhonduan() interrupt 5 using 1
{
ADC_CONTR &= ~0x20;//清楚ADC中斷溢出標志位
Data = ADC_RES;//P2讀取ADC的值
ADC_CONTR |=0x40;//繼續ADC轉換
}
/******************************************************************
軟件延時函數
******************************************************************/
void delay100ms(void) //誤差 -0.000000000013us
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=229;b>0;b--)
for(a=8;a>0;a--);
_nop_();
_nop_();
}
/******************************************************************
PWM初始化函數
16位PWM
******************************************************************/
void PWM_init(void)
{
P_SW2 = 0x80;
PWMCKS = 0x00; //PWM時鐘為系統時鐘
PWMC = 0x5667; //設置PWM周期為1000H個PWM時鐘 約1khz
PWM0T1 = 0x5215; //在計數值為100h地方輸出低電平
PWM0T2 = 0x0452; //在計數值為500h地方輸出高電平
PWM0CR = 0x80; //使能
P_SW2 = 0x00;
PWMCR = 0x80; //啟動PWM模塊
}
/******************************************************************
PWM初始化函數
8位PWM
*******************************************************************
寄存器說明
CCON PCA控制寄存器
B7 B6 B5 B4 B3 B2 B1 B0
CF CR - - CCF3 CCF2 CCF1 CCF0
CF;計數器溢出中斷標志
CR:PCA計數允許位(1/on)
CCFn:PCA模塊中斷標志
********************************************************************
CMOD PCA模式寄存器
B7 B6 B5 B4 B3 B2 B1 B0
CIDL - - - CPS[2:0] ECF
CIDL 空閑模式下是否停止計數 0繼續,1停止
CPS[2:0]:PCA的輸入時鐘 【000|系統時鐘/12】【001|系統時鐘/2】【010|定時器0的溢出脈沖】【100|系統時鐘】
ECF:PCA計數器溢出中斷允許位 0禁止,1允許
********************************************************************
CCAPMN PCA模塊模式控制寄存器
B7 B6 B5 B4 B3 B2 B1 B0
- ECOM0 CCAPP0 CCAPN0 MAT0 TOG0 PWM0 ECCF0
ECOMn:允許PCA模塊n的比較功能
CCAPPN:允許PCA模塊n進行上升沿捕獲
CCAPNn:允許PCA模塊n進行下降沿捕獲
MATn:允許PCA的匹配功能
TOG0:允許PCA模塊n的高速脈沖是輸出功能
PWMn:允許PCA模塊n的脈寬輸出調制功能
ECCFn:允許PCA模塊n的匹配/捕獲中斷
******************************************************************/
void PWM_u8init(void)
{
CCON = 0x00;
CMOD = 0x08; //PCA時鐘為系統時鐘
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA模塊0為PWM工作方式
PCA_PWM0 = 0x00; //PCA模塊0輸出8位PWM
CCAP0L = 0x10; // 占空比
CCAP0H = 0x10; //占空比
CR = 1; //啟動PCA計時器
}
/*********************************************************************************************
函數名:PWM占空比設置函數
調 用:PWM_set(uchar PWM);
參 數:無
返回值:無
結 果:無
備 注:無
/**********************************************************************************************/
void PWM_set(uchar PWM)
{
CCAP0L = PWM; // 占空比
CCAP0H = PWM; //占空比
}
/*********************************************************************************************
函數名:定時器初始化函數
調 用:InitTimer0();
參 數:無
返回值:無
結 果:將定時器計數器初始化為定時器,工作方式0
備 注:無
/**********************************************************************************************/
void InitTimer0(void)
{
TMOD = 0x00;
TH0 = (65536-86)/256;//1khz
TL0 = (65536-86)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/*********************************************************************************************
函數名:定時器0中斷處理函數
調 用:無需調用
參 數:無
返回值:無
結 果:無
備 注:無
/**********************************************************************************************/
void Timer0Interrupt(void) interrupt 1
{
TH0 = (65536-86)/256;
TL0 = (65536-86)%256;
}
復制代碼
ADC.zip
2020-5-5 09:33 上傳
點擊文件名下載附件
75.31 KB, 下載次數: 8
源程序
作者:
Yusheng哥
時間:
2020-5-5 09:39
發出的程序格式亂了,就請各位大佬看一下源程序把,謝謝大家了
作者:
Yusheng哥
時間:
2020-5-6 16:56
不要沉了呀,我頂
作者:
wulin
時間:
2020-5-7 08:22
不用寫那么多,就把STC的ADC和PWM官方示例整合一下就行。以下程序只是提供編程思路,不代表可以直接使用。
#include <STC8.H>
#include "intrins.h"
void delay100ms(void)
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=229;b>0;b--)
for(a=8;a>0;a--);
_nop_();
_nop_();
}
void main()
{
//初始化PWM
CCON = 0x00;
CMOD = 0x08; //PCA時鐘為系統時鐘
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA模塊0為PWM工作模式
PCA_PWM0 = 0x00; //PCA模塊0輸出8位PWM
CCAP0L = 0xff; //PWM占空比為0%
CCAP0H = 0xff;
CR = 1; //啟動PCA計時器
//初始化ADC
P1M0 = 0x00; //設置P1.0為ADC口
P1M1 = 0x01;
ADCCFG = 0x0f; //設置ADC時鐘為系統時鐘/2/16/16
ADC_CONTR = 0x80; //使能ADC模塊
while (1)
{
ADC_CONTR |= 0x40; //啟動AD轉換
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
ADC_CONTR &= ~0x20; //清完成標志
CCAP0H = ADC_RES; //讀取ADC結果控制PWM,默認P0.0輸出
// CCAP0H = ~ADC_RES; //讀取ADC結果取反控制PWM
delay100ms();
}
}
作者:
怎么起名字
時間:
2020-5-13 23:33
樓主,我想產生10khz的pwm波應該怎么修改呢?
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1